潘恒 原创做品转载请注明出处 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000linux
1、gdb跟踪调试内核从start_kernel到init进程启动tcp
1.qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S # 关于-s和-S选项的说明:
// -S freeze CPU at startup (use ’c’ to start execution) cpu初始化以前把它冻结起来
// -s shorthand for -gdb tcp::1234 在1234端口上创建了一个gdb server
若不想使用1234端口,则能够使用-gdb tcp:xxxx来取代-s选项函数
2.启动Linux内核的三个参数:调试
代码:rest
qemu -kernel (文件名) -initrd (rootfs.img)
1)qemu至关于打开一个虚拟机code
2)kernel启动一个内核,位置由其后的文件名指定。若是在当前目录下,能够直接输入文件名,若是不是,则须要输入该内核的全路径。server
3)initrd指令是挂了一个ramdisk虚拟硬盘,是内核的重要补充,rootfs.img就是这个虚拟硬盘,内有分区,而后启动的实际上是其中的init文件,这个文件是由以前的menuOS编译而成,gcc -o命名为init。 blog
3.使用gdb跟踪调试:进程
1)加载符号表、创建链接、设置断点:虚拟机
2)输入c让qemu上的linux继续运行:
3)输入list查看设置断点处的代码:
2、总结
init中main.c中有一个start_kernel函数,在start_kernel函数的尾部调用了一个rest_init
1)0号进程
有一个全局变量init_task,即手工建立的PCB,0号进程,即最终的idle进程。0号进程一直存在,系统没有进程须要执行时调度到0号进程。
2)0号进程建立了1号进程和其余
rest_init()中有kernel_thread(kernel_init,NULL,CLONE_FS)
kernel_init中有run_init_process,
run_init_process建立了1号进程,默认路径下的程序。