跟踪分析 Linux 内核的启动过程
本章介绍Linux内核源代码的目录结构,并基于Linux内核源代码构造一个简单的操作系统MenuOS,同时在MenuOS启动过程中跟踪分析Linux内核的启动过程。
1.使用实验楼的虚拟机打开 shell
2.跟踪调试Linux内核的启动过程
$ qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S
# 关于-s和-S选项的说明:
# 1. -S
# -S freeze CPU at startup (use ’c’ to start execution)
# 2. -s
# -s shorthand for -gdb tcp::1234
# 若不想使用1234端口,则可以使用-gdb tcp:xxxx来取代-s选项
在start_kernel处设置断点,刚才是stop状态,如果按“c”继续执行,那么系统开始执行,启动到start_kernel函数的位置停在断点处,如上图所示的断点查看代码。
输入list查看
start_kernel中最后一句为rest_init,内核启动完成后,有一个call_cpu_idle,当系统没有进程需要执行时就调用idle进程。rest_init是0号进程,他创建了1号进程init和其他的一些服务进程。
设置rest_init断点
3.总结
总结: init task() (PID为0)在创建了init 进程后,调用cpu idle() 演变成了idle 进程,执行一 次调度后,init进程运行。1号内核线程负责执行内核的部分初始化工作及进行系统配置,最后调用do_ execve加载init程序,演变成init进程(用户态1号进程),init进程是内核启动的第一个用户态进程。kthreadd (PID为2)进程由0号进程创建,始终运行在内核空间,负责所有内核线程的调度和管理