1.【Busybox】Busybox源码分析-02 | init程序
2.Linux 下的 init 0,1,2,3,4,5,写字机控制源码6知识介绍
3.Linux内核|驱动模型initcall和module_init
4.引导Linux系统的Init文件及其作用linuxinit文件
5.Linux内核源码分析:Linux内核版本号和源码目录结构
【Busybox】Busybox源码分析-02 | 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命令会显示当前的运行级别。Linux 下的 init 0,1,2,3,4,5,6知识介绍
在Linux系统中,json解析接口源码init进程扮演着至关重要的角色。它作为内核启动后的第一个用户级进程,引导整个系统的初始化过程。init进程的正确位置通常在/sbin/init,如果找不到,系统将尝试通过/bin/sh启动,否则启动失败。init进程共分为七个级别,每个级别代表不同的系统运行模式:
- Level 0:停机或关机,绝不应设置为默认。
- Level 1:单用户模式,仅root权限可用。
- Level 2:多用户模式,不支持NFS。
- Level 3:标准的多用户模式,即完全多用户模式,nfs服务启用。
- Level 4:安全模式,用于系统维护。
- Level 5:图形化界面模式。
- Level 6:重启,同样不应设置为默认。
每个级别的网页源码转图片运行状态由/etc/rc.d/下的rc*.d文件中的脚本控制。例如,init 0对应执行halt和killall命令,表示关机;init 1启动的程序则包括单用户模式服务。通过观察这些目录下的文件,可以更直观地理解每个级别的功能差异。不同的Linux系统版本可能文件结构有微小变化,但都是通过软链接实现的。
要深入了解Linux技术,可以关注公众号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,其流程如下。
引导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脚本控制运行系统时自定义的系统服务,从而大大提升系统运行的稳定性和性能。
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内核源码易于理解和维护。