1.引导Linux系统的Init文件及其作用linuxinit文件
2.分析LinuxInit代码的深入分析linuxinit代码
3.Linux内核源码分析:Linux内核版本号和源码目录结构
4.Linux内核|驱动模型initcall和module_init
5.BusyboxBusybox源码分析-02 | init程序
引导Linux系统的Init文件及其作用linuxinit文件
Init文件是Linux系统中的一个重要的系统启动文件,主要用于控制操作系统初始化所执行的系统服务,它扮演着操作系统启动过程中一个很重要的角色。
Linux系统中的Init文件位于/etc/init.d/文件夹下面,它是操作系统系统设定的初始化文件,其中涉及系统启动、电子烟花源码运行和停止的全部程序。它不像一般的脚本文件,它的格式与机器类型有关,而且它的每一行文本都有特定的含义,记录了每一步引导Linux系统的步骤和执行程序,它主要包括如下几个部分:
1、 开机启动:当Init文件被执行时,它会启动操作系统所需要的核心部分,包括内存管理器,文件系统,进程管理器,设备驱动程序以及网络服务等。
2、 配置文件:Init文件中还会存放系统配置文件,例如登录脚本,shell环境设定文件,时间同步脚本等。话费抽奖活动页面源码
3、 服务控制:Init文件还可以控制系统服务的启动、停止、重启等操作,可以使系统更加稳定。
除了以上这些,Init文件还有一系列的脚本,控制自定义的系统服务,可以根据使用环境的不同来安装或卸载系统服务,这些脚本文件可以位于/etc/init.d/文件夹下,也可以位于/etc/rc.d/文件夹或者是/etc/rc.local文件中,这将丰富我们对系统管理操作的灵活性。
总之,Linux系统中Init文件是系统引导的核心,它负责控制操作系统初始化所执行的服务,以及源码文件的配置等。它的作用不仅在操作系统的引导过程中,它还可以通过shell脚本控制运行系统时自定义的系统服务,从而大大提升系统运行的稳定性和性能。
分析LinuxInit代码的深入分析linuxinit代码
Linux Init代码是操作系统Linux中最重要的部分之一,它是操作系统启动后和用户登录前的过渡环节,主要负责加载硬件设备驱动程序和核心模块,怎么在gitbud找源码加载配置文件和外部服务,以及配置和映射内存等,是操作系统的正确运行的基础。那么本文就讲讲Linux Init代码的深入分析。
首先,我们来看看Linux Init代码的框架构成,它是由init进程驱动的,其中init进程是Linux操作系统中最核心的一个程序,用于启动系统内核初始化和加载外部服务,这一过程大致可分为以下3个步骤:
第一步,init进程从/etc/inittab文件加载并启动其他进程;第二步,init进程从/etc/init.d目录下加载用户自定义的服务脚本;第三步,init进程从/etc/rc?.d目录启动系统的运行级别(Runlevel)服务。
其次,可以看看Linux Init代码具体的实现过程:
1. init进程从/etc/inittab文件加载并启动其他进程:
init进程实际上读取/etc/inittab文件并解析配置参数,根据配置内容启动其他进程。
例如:
::sysinit:/etc/rc.d/rc.sysinit
该配置行告诉init进程,当系统刚启动完毕后它需要调用/etc/rc.d/rc.sysinit进行系统初始化。
2. init进程从/etc/init.d目录下加载用户自定义的服务脚本:
init进程会检查/etc/init.d目录下是否存在用户自定义的服务脚本,例如Apache、SSH等,并会按照默认的私募改良macd源码规则去加载和运行对应的服务脚本来启动相应的服务。
3. init进程从/etc/rc?.d目录启动系统的运行级别(Runlevel)服务:
init进程会从/etc/rc?.d目录读取运行级别(Runlevel)配置文件(rc?.d),来根据配置文件加载指定的服务。
其中,启动运行级别服务的代码示例如下:
# List runlevel directories
for i in /etc/rc?.d ; do
# Go through the scripts in that directory
for x in $i/S* ; do
# Split off the runlevel number
level=`echo $x | cut -b 4-`
# If it’s the one we want run it
if [ “$level” = “$RUNLEVEL” -o “$level” = “S” ]; then
# Source shell functions
. /etc/rc.d/init.d/functions
# Run the service
echo -n $”Starting $x: ”
daemon $x start
fi
done
done
最后,通过以上分析,可以总结出Linux Init代码的执行过程是以init进程为核心,由/etc/inittab、/etc/init.d以及/etc/rc?.d三部分组成的,其中init进程用于启动系统内核初始化和加载外部服务,/etc/inittab文件用于加载其他进程,而/etc/init.d目录用于自定义服务脚本,最后/etc/rc?.d目录用于启动不同级别服务。
Linux内核源码分析:Linux内核版本号和源码目录结构
Linux内核版本和源码目录结构对于理解其内部设计至关重要。内核分为稳定版和开发版,版本号由主版本、次版本和修订版本组成,次版本号用于区分两者。内核代码分散在庞大的源码中,组织在个C文件和若干个特定目录下。
Linux源码的根目录下,首先是arch目录,负责屏蔽不同体系结构间的微信源码免费模式差异,如虚拟地址翻译函数switch_mm。block目录存放通用的块设备驱动程序,如硬盘和U盘的读写操作。驱动程序通常在drivers目录,但块设备驱动被独立出来,因为它们的读写逻辑通用。certs目录用于存储认证和签名相关的代码,保障系统安全。
内核模块是Linux 2.2版本后引入的概念,以.so文件形式独立,根据需要动态加载,带来灵活性但也增加了安全风险。crypto目录包含加密和压缩算法,保障数据安全。Documentation目录提供内核模块的文档和规范,drivers目录存放硬件驱动,fs目录处理文件系统,init目录负责内核初始化,ipc目录负责进程间通信,kernel目录包含核心功能代码,lib目录是内核的库函数集,mm目录负责内存管理,net目录处理网络协议,samples目录包含示例代码,scripts目录是编译和调试工具,security目录负责安全机制,sound目录负责音频处理,tools目录包含开发工具,usr目录是用户打包,virt目录关注虚拟化,LICENSE目录则记录了许可证信息。
除了目录,源码中还有COPYING(版权声明)、CREDIT(贡献者名单)、Kbuild(构建配置)、MAINTAINERS(维护者信息)、Makefile(编译指令)和README(基本信息)等文件,它们分别提供了内核使用、贡献者认可、构建指导和基本介绍。这些组织结构使得Linux内核源码易于理解和维护。
Linux内核|驱动模型initcall和module_init
内核版本:Linux-6.1
文章目录汇总:所有文章目录 - 知乎 (zhihu.com)
模块初始化的宏观:module_init
在Linux内核开发和驱动开发中,module_init 是一个常见的宏,定义在 include/linux/module.h 文件中。它的实现会根据是否定义了 MODULE 宏有所不同,这决定了驱动是与内核编译到一起,还是单独编译为.ko文件。
MODULE 的定义通常通过编译时的参数传递,可通过查看 Makefile 文件,如在编译.ko时使用特定的编译选项,而链接到内核时则不会使用这些选项。
未使能 MODULE 情况下,module_init 实际上是作为特殊 initcall,用于声明初始化函数并控制函数调用顺序。initcall 有多个级别,module_init 实际对应于 device_initcall,级别为 6。initcall 会在编译时声明一个 initcall_t 类型的静态变量,并放入内核的 .init.data 段。
initcall 的实现和行为可以通过查看 arch-linux-gnu-nm -n vmlinux 命令的输出进行分析。以 __initcall__kmod_cpuinfo____cpuinfo_regs_init6 为例,这个 initcall_t 类型的静态变量的名称和行为可从 __initcall_name 和 __initcall_id 的输出得出。
rootfs_initcall 在 5 秒后被调用,它在 do_basic_setup 中执行,需要在此之前将存储介质准备好,如读取文件系统镜像。
console_initcall 用于尽早输出日志,其初始化函数在 console_init 中调用,而 console_init 尽量选择较早时机进行。
链接脚本中,initcall 声明的变量放入以 .initcall 开头的段中,每个级别对应一个段,并按顺序放入 .init.data 段。
initcall 的执行时机包括 do_pre_smp_initcalls 和 do_basic_setup,前者在多核处理器和调度系统初始化之前执行,后者按 initcall 级别依次执行指定函数。链接时和多次编译的顺序可能影响同级别 initcall 的执行顺序。
当 MODULE 使能时,Linux 中的某些模块可选择链接到内核或编译为.ko文件。initcall 宏被定义为 module_init 以兼容两者。分析 module_init 实现,可以参考《module_init 源码》。
__inittest:代码中未找到调用地方,但从 v2.6.0 对 module_init 的注释推测,可能是为了防止编译器警告。
init_module 是 initfn 的别名,具有相同的地址,通常为静态函数,而 init_module 为全局函数。在命令行使用 insmod 或 modprobe 安装模块时,系统最终调用 init_module 或 finit_module。
init_module 和 finit_module 用于从用户态加载.ko文件,查看 man 2 init_module 可以了解这两个函数的具体使用。
加载模块的流程最终会调用 load_module,其流程如下。
BusyboxBusybox源码分析- | init程序
在Linux内核启动后期,init线程执行的第一个用户空间程序是init,这个程序在Busybox源码中的实现由/init目录下的init.c编译而成,其入口点为init_main()。在init_main()函数中添加了标识代码,验证了这一过程。实际上,当Busybox编译安装后,会通过链接指向../bin/busybox来执行init。 分析init程序,当CONFIG_FEATURE_USE_INITTAB配置启用时,会依据/etc/inittab文件中的配置进行操作;若文件不存在或未启用该配置,init将执行默认行为,如运行INIT_SCRIPT和启动"askfirst" shell。而BusyBox的init不支持运行级别,sysvinit是需要的选项来处理运行级别管理。 Linux支持7个运行级别:0:停机状态,等同于关机,不可作为默认运行级别。
1:单用户模式,用于系统维护,禁止远程登录。
2:多用户无网络模式。
3:多用户有网络模式,常见运行级别。
4:保留,未使用。
5:X图形界面,登录后进入。
6:正常关闭并重启,同样不能作为默认运行级别。
可以通过runlevel命令查看当前运行级别,如在Ubuntu系统中,运行runlevel命令会显示当前的运行级别。