原创作品(陈晓爽 cxsmarkchan)
转载请注明出处
《Linux内核分析》MOOC课程学习笔记
操作系统的内核启动是一个复杂的过程,在这里,我们仅仅抓住内核启动的主要脉络,了解linux内核的启动过程。需要了解的问题包括:linux内核启动入口、启动时的初始化操作、0号进程和1号进程的启动、主循环的启动等。
本文实验平台为实验楼Linux内核分析,实验所用的代码可以参考这里。
1 linux内核启动流程
打开实验楼Linux内核分析,选择第3个实验:跟踪linux内核启动过程。打开控制台,用cd LinuxKernel
切换到LinuxKernel文件夹,并执行如下命令:
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img
可以得到如下运行结果:
这里MenuOS是一个简化的操作系统,只有help/version/quit三条命令可以使用。
可以看到,启动过程中有一系列的状态输出,分别代表了内核进程和用户态进程的初始化。初始化过程包含如下部分:
1. 系统启动时有一个入口函数,在本系统中,为init/main.c下的start_kernel函数,在必要的初始化后,从此处开始加载操作系统。
2. start_kernel函数中,对操作系统内核的各个部分进行初始化。在内核初始化完成后,调用rest_init函数。
3. rest_init函数中,加载系统磁盘,启动系统的第一个用户态进程,并启动消息循环。这里的磁盘是rootfs.img,MenuOS就是在磁盘中加载的。
4. 加载完毕后,即得到上图所示的画面。
2 用gdb跟踪linux内核启动
下面我们采用gdb跟踪操作系统的启动进程。
首先以调试态启动操作系统,输入如下命令:
qemu -kernel linux-3.18