- 执行体系结构相关的设置代码:
- 如果需要,解压缩并移动内核代码本身
- 初始化硬件
- 这可能包括底层内存管理的设置
- 将控制权转交给函数
start_kernel()
start_kernel()
去执行以下事情(以及其他事情):- 打印内核版本和命令行
- 启动控制台输出
- 启用中断
- 校准延迟循环
- 调用
rest_init()
,这个函数会:- 启动一个内核线程来运行
init()
函数 - 进入空闲循环
- 启动一个内核线程来运行
init()
:- 启动其他处理器(在 SMP 机器上)
- 启动设备子系统
- 挂载 root 文件系统
- 释放不使用的内核内存
- 运行
/sbin/init
(或者/etc/init
,或者...)
此时,用户级 init
程序正在运行;它将完成启动网络设备并在控制台上运行 getty
(登录程序)等任务。
加入自己的 printk
,并观察那个子系统的 printk
相对于自己的 printk
何时出现,就可以指出那个子系统是在 start_kernel()
中还是在 init()
中初始化的。例如,如果想要知道 ALSA 声音系统何时被初始化,那么将 printk
加入到 start_kernel()
和 init()
的起始处,然后找到“Advanced Linux Sound Architecture [...]” 相对于您的 printk
在何处打印出来。