Linux内核分析第三周学习博客——跟踪分析Linux内核的启动过程
实验过程截图:
过程分析:
在Linux内核的启动过程中,一共经历了start_kernel,rest_init,kernel_thread等几个函数的执行。其中start_kernel相当于普通C程序的main函数。Trap_init负责初始化中断向量,mm_init负责内存管理模块初始化,sche_init负责调度模块初始化。
两把宝剑:
1.中断上下文切换
2.进程上下文切换
Qemu工具学习:
格式
:
qemu -kernel 文件名 -initrd (rootfs.img)
-kernel后跟要启动的内核的文件名(不在当前目录需要全路径)
-initrd 后跟虚拟硬盘名,默认启动其中名为init的文件。在该实验里为menuOS。
start_kernel函数末尾调用rest_init,负责当系统没有进程需要执行时就调用到idle进程
0号进程
有一个全局变量init_task,是手工创建的PCB,也是最后的idle进程,与rest_init函数有配合作用。
编译内核
1.原因:生成符号表
2.方法:
(1)make config操作简单,耗时
(2)make menuconfig图形化界面
(3)make allnoconfig 全no选择处理
总结:
对于linux系统启动过程,可以类比道家的“无中生有”的思想,道生一(start_kernel....cpu_idle),一生二(kernel_init和kthreadd),二生三(即前面0、1和2三个进程),三生万物(1号进程是所有用户态进程的祖先,2号进程是所有内核线程的祖先)。
通过几个最初的函数作为基础,逐渐搭建出一个体系,供其它进程进一步发挥;当其它进程工作到一段落,再重回起点,进入暂时休眠的状态。
zl + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ”