-
原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
- Linux内核启动过程
- 首先打开并冻结实验提供的Linux系统,并开启端口来调试。
- cd LinuxKernel/
- qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S
- 然后在另一个shell里打开gdb进行内核的跟踪
- gdb
- (gdb)file linux-3.18.6/vmlinux # 在gdb界面中targe remote之前加载符号表
- (gdb)target remote:1234 # 建立gdb和gdbserver之间的连接,按c 让qemu上的Linux继续运行
- 设置断点
- (gdb)break start_kernel # 断点的设置可以在target remote之前,也可以在之后
- 内核的启动由start_kernel函数开始
- 查看代码具体位置
- (gdb)list
- start_kernel函数创建了一个全局变量init_task,即创建了PCB,其中的0号进程为idle进程
- 然后start_kernel函数继续进行硬件初始化
- 然后在start_kernel函数尾部调用rest_init函数
- 这里的rest_init就是0号进程(idle进程)
- rest_init函数中执行了kernel_thread(kernel_init,NULL,CLONE_FS)
- 其中的kernel_init中有run_init_progress,这里initi进程即1号进程被启动
- 然后rest_init函数中执行了pid=kernel_thread(kthreadd,NULL,CLONE_FS | CLONE_FILES)
- 这里的kthreadd为所有内核线程的祖先,可称为2号进程
- 至此系统就完成启动