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

时间:2020-12-21 04:58:29

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

攥写人:杨光  学号:20135233

( *原创作品转载请注明出处*)

( 学习课程:《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 )

知识总结:

****Linux内核中关键目录:

  arch:不同cpu的支持,我们主要关注的是其中x86文件夹

  init:内核启动的相关代码,期中main.c是内核启动的起点,main.c中的start_kernel是内核初始化的起点

  kernel:Linux内核的核心代码所在

    ipc:进程通信相关

      fs:文件系统

  mm:内存管理

  net:网络相关

****0号进程:rest_init

  它再创建kernel_init,创建1号进程init

****1号进程、第一个用户态进程:init

****trap_init:中断初始化

****sched_init:进程调度初始化

 

 

 

实验部分:

*************使用自己电脑配置环境过程*************

首先,使用wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.18.6.tar.xz命令下载内核文件

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

 

下载完成后,使用 xz -d linux-3.18.6.tar.xz  tar -xvf linux-3.18.6.tar命令进行解压

 

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

解压完进入linux-3.18.6文件夹make i386_deconfig

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

 

然后make安装

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

此处由于被墙,我是使用的从网易云课堂下载的menu包,自己复制到虚拟机上

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

 

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

 

由此,虚拟机的环境便搭建完成了,之后跟实验楼过程基本一致

***********实验楼过程***********

cd LinuxKernel 进入目录  

使用qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img命令启动内核

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

 

 

使用qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S指令

 -S cpu初始化之前,冻结启动,之后gdb的过程中输入“c”进入下一步
-s 在端口上创建tcp接口

 

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

另开一个shell窗口,使用gdb命令进行调试

注意!必须先进入 LinuxKernel文件夹,不然之后file会找不到文件,下图就是进入的示范

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

 

现在再gbd就没问题啦,加载符号表,设置端口,断点

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

 

设置了断点之后,输入“c”进行下一步,此时内核会运行到断点位置停止

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

回到shell,使用list命令列出此时的代码段

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

 

设置新的断点rest_init,然后使用“c”命令继续

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

 

此时内核运行的状态

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

使用list命令列出此时的代码段

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

 

 

根据实验中追踪到的行数,在代码中找到对应位置,进行分析    代码链接http://codelab.shiyanlou.com/xref/linux-3.18.6/

 

***********************************************************************

总结分析:

*内核启动的代码在 init文件夹main.c文件中 的 start_kernel

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

 

*创建pcb

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

*下图分别为trap(中断)mm(内存管理) sched(进程调度) 模块的初始化

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

*start_kernel函数的最后一句是rest_init();

这个进程在内核启动时就一直存在,是0号进程,0号进程是最终的idle进程(rest_init)

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

*这个0号进程创建了1号进程和其他的服务线程

1号进程(第一个用户态进程):跟踪分析Linux内核的启动过程

服务线程:跟踪分析Linux内核的启动过程

*kernel_init中,下图红线所划就是第一个用户态进程的创建(1号进程)

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

*在0号进程创建1号进程后,一个进程创建另一个进程和线程,一生二、二生三、三生万物,系统内核就启动了