跟踪分析Linux内核的启动过程

姓名:王晨光

学号:20133232

王晨光 + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 

     linux内核分析的第三课,讲到了操作系统的启动过程,课程的实验要求使用gdb跟踪调试内核,分析系统从start_kernel到init进程启动的整个过程。

一、实验过程

     1、首先登陆实验楼,打开shell终端,输入cd LinuxKernel,再输入指令qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img 然后内核启动,这个系统一共有3个命令,即help、version、quit.

下图为输入的指令以及内核启动的界面。

2、随后开始使用gdb进行内核启动过程的跟踪

     linux内核启动过程中在我的印象中就是很快的到了上图的界面。然而不是这样,内核启动的过程会经历很多,例如函数的调用以及初始化的过程,这些过程很快,我们看不见。需要使用gdb跟踪内核的启动过程。

    输入指令qemu-kernel linux-3.18.6/arch/x86/boot/bzimage -initrd rootfs.img -s -S,这个指令的功能是将内核启动暂停,方便我们接着输入指令进行一步一的观察启动过程。下图为输入指令后将内核启动过程暂停。

3、在另一打开一个shell,及进行水平分割,输入指令gdb进行调试。

   要分别输入3个指令:

file linux-3.18.6/vmlinux加载符号表

target remote:1234建立和被调试程序的连接

break start_kernel  在start_kernel函数入口设置断点。当程序执行到断点处时会自动停下来。

通过这样的方法我们可以使程序按照我们的意愿运行和暂停,一观察内核启动的具体过程。

4、输入break start_kernel后,再输入c执行。再继续按照课件内容进行操作得到下图:

内核启动从start_kernel函数开始,到rest_init()函数之前的部分都是完成初始化的工作。

二、实验总结

     实验过程可以说是相当的曲折,因为不知道什么原因,在用实验楼输入完指令qemu -kernel linux-3.18.6/arch/x86/arch/boot/bzImage -initrd rootfs.img后,再无法输入接着的指令。然后尝试运用进行水平分割,就可以进行指令的输入了。通过这个实验,我明白了内核启动的有关过程,知道了内核启动过程中不光是一瞬间就完成的,而是进行了一系列的初始化,和函数调用。内核的启动从start_kernel函数开始,完成各种初始化工作,当初始化完成后,就由rest_init完成剩余工作,随后rest_init创建并启动内核线程init,存入内存中。这个实验中的相关指令中的很多细节没有懂,但是大致过程我已经了解,知道了内核启动中经历的一系列过程。

三、实验问题

idle进程、1号进程是怎么来的?

idle进程是0号进程。start_kernel中有1号进程init的启动。

 

posted on 2016-03-12 14:46  20133232王晨光  阅读(375)  评论(0编辑  收藏  举报

导航