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

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

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

一、实验要求

  1. 通过实验楼的Linux虚拟机,使用gdb跟踪调试内核从start_kernel到init启动。
  2. 详细分析start_kernel到init进程启动过程并结合实验截图撰写一篇署名博客。

二、实验步骤

  1. 使用实验楼提供的虚拟机打开shell,运行如下的命令
    这里写图片描述
    运行结果如下图显示
    这里写图片描述
    通过这张图可以看到,这是已经编译了实验楼提供的已经安装好liunx内核MenuOS。通过这个内核,我们可以完成一些简单的命令行菜单小程序(help、version、quit),和上学期软件工程课程中学习到的类似。命令行小程序如下图所示:
    这里写图片描述
  2. 使用gdb跟踪调试Linux内核启动过程
    1)在shell中输入如下明令:
    这里写图片描述
    -S :freeze CPU at startup(use ‘c’ tostart execution)在系统启动的时候冻结CPU,使用c继续执行后续的操作
    -s:shortthand for -gdb tcp::1234 打开远程调试端口,若不想使用1234,则可以用-gdb tcp:xxxx来取代
    通过执行以上命令,可以看到kernel 的启动被冻结了,如图:
    这里写图片描述

2)打开另外一个窗口,输入以下命令
这里写图片描述
可以将系统继续向下执行至,start_kernel处,如图:
这里写图片描述
此时,可以使用list命令查看之后的代码,如图:
这里写图片描述
3)跟踪至init进程
使用break可以继续设置断点,c继续执行,用list查看函数代码,通过输入 break rest_init,可跟踪至kernel启动中的init进程
这里写图片描述
这里写图片描述
这里写图片描述

三、Start_Kernel函数的执行过程(参考网络)

  1. Linux内核启动的时候首先会调用start_Kernel函数,该函数相当于普通C程序中的main()函数,在start_kernel函数中会调用大量的init函数来对内核环境进行初始化;包括CPU初始化、内存管理初始化、进程管理初始化、文件系统初始化、中断、同步互斥等。
  2. Linux内核通过调用start_kernel函数完成初始化之后,然后调用rest_init()函数来启动第一个用户进程,该进程被称为1号进程。
  3. 关于0号进程:
    所有进程的“祖先”,由start_kernel()函数在内核启动过程猴子那个“手动”创建的一个内核进程,始终处于内核态,在内核启动之前,0号进程完全变成idle进程,系统开始无限循环。
    4、关于1号进程
    1号进程又称“init进程”,由0号进程在start_kernel调用rest_init创建。init进程的PID为1,当调度进程选择到init进程时,init进程开始执行kernel_init()函数

四、实验结论

  1. 通过追踪分析Linux内核的启动过程的实验,我对Linux系统的启动过程有了更深的了解,重要的是学会了在Liunx中一些追踪分析的方法。受益匪浅。
  2. start_kernel产生cpu_idle ,cpu_idle产生 kernel_init和kthread ;kernel_init和kthread产生0、1、2进程;1号进程时所有用户态进程的祖先,2号进程时所有内核线程的祖先。(参考庄华健博客)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值