第三周 内核调试
1.实验结果
这周主要是搭建linux内核测试的环境,以及简单分析linux内核的相关函数和执行步骤。
首先是将一个内存镜像装入内核中运行的实验,这里是使用menu程序。实验结果如下。
第二个实验主要是搭建gdb的测试平台,利用gdb设置断点,将断点设置在start_kernel处。以下是实验结果
2运行分析
这里主要分析以下内核启动时进程以及线程的初始化流程。首先附上代码地址。
http://codelab.shiyanlou.com/xref/linux-3.18.6/
我们要关注的内核初始化代码主要位于init/main.c 中的start_kernel函数中,其中函数首先对各个硬件以及环境变量进行初始化,其中561行trap_init()主要是进行中断的初始化,我们需要关注的进程初始化函数rest_init()位于start_kernel最后一行。其程序调用的大致框图如下,下图主要说明了程序进程的初始化作用,其中主要思想是初始化一个process0然后通过process0再生成其它的进程。即下图中的kthread参数。cpu_idle_loop则主要是个while(1)函数,用于协调进程间调用。
3总结
linux启动过程中首先有一个启动进程即0号进程,而这个进程是对linux系统不可见的,而其它所有的进程都是由这一个进程创建的。也就是说process1也是由process0创建而来的。而idle进程则主要是在系统的空闲时被系统调用。