Linux 内核启动代码简析

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

 

一、实验环境准备

1、编译源代码:

2、 制作initrd

3、尝试运行

qemu1 图1.第一次启动

 4、重新编译内核,打开调试功能

menuconfig

menuconfig2图2.menuconfig配置

5、附:上诉操作所依赖的组件

 

二、调试内核启动进程

 1、qemu启动内核,同时打开调试端口。

 qemu2 图3. 开始启动(stopped状态)

2、运行gdb开始调试

如下图,内核在运行到start_kernel( )的时候终止执行

qemu3 图4. 内核在start_kernel()处中断

三、关键代码分析

1、start_kernel( ) 函数,进行一系列内核初始化准备

 

2、init进程的启动 rest_init( )

 3、 schedule_preempt_disabled( )的细节

4、附kernel_init() 函数的内容,未分析

 

四、作业小结

(对“Linux系统启动过程”的理解)

详细了解了linux内核的启动过程,心里真是舒畅啊,windows用户基本上应该没有我们的这种机会啦,哈哈。

好了,现在说正事。BIOS加载引导程序的那些我们暂且不谈,就从内核被引导开始说起吧。

初期,也就是start_kernel() 之前,最基本的准备阶段,应该用到了大量的汇编代码初始化硬件用来准备内核启动环境。然后进入start_kernel() ,在这里进行了进一步的各种初始化、环境准备,比如内核锁、调度程序、内存页等的初始化操作,是用户态进程运行的基础。

在start_kernel() 的最后,调用了函数rest_init() ,在该函数里启动了第一个用户态进程 -- init,然后CPU进入idle状态,当前进程也变成了传说中的idle进程。之后init就开始不断地fork各种进程,一个可以操作的linux系统也就成功启动了。

参考资料:

http://www.cnblogs.com/hpunix/articles/2006782.html

http://blog.chinaunix.net/uid-20746260-id-3176497.html

《Linux 内核启动代码简析》有1个想法

发表评论

电子邮件地址不会被公开。 必填项已用*标注