第三周 内核调试

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进程则主要是在系统的空闲时被系统调用。

原文地址:https://www.cnblogs.com/qtalker/p/4351903.html