本章介绍Linux内核源代码的目录结构,并基于Linux内核源代码构造一个简单的操作系统MenuOS,同时在MenuOS启动过程中跟踪分析Linux内核的启动过程。
1.构造一个简单的Linux内核
在“实验楼”的虚拟机中,一下命令就可以把Linux系统和一个简单的文件系统运行起来:
cd LinuxKernel/
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img
关掉QEMU界面:同时按住crtl+Alt,然后直接关掉界面。
2.跟踪调试Linux内核的启动过程
这时候就可以再次输入命令启动内核,然后它就会被冻结。
再打开一个窗口,启动gdb,把内核加载进来,进来连接。
出现错误没有进入liunxKernel目录下。
解决方案:cd ~/LinuxKernel/。
在start_kernel处设置断点,刚才是stop状态,如果按“c”继续执行,那么系统开始执行,启动到start_kernel函数的位置停在断点处,如上图所示的断点查看代码。
输入list查看:
start_kernel中最后一句为rest_init,内核启动完成后,有一个call_cpu_idle,当系统没有进程需要执行时就调用idle进程。rest_init是0号进程,他创建了1号进程init和其他的一些服务进程。
设置rest_init断点:
1.start_kernel()
main.c中没有main函数,start_kernel()相当于c语言中的main函数。
2.init_task()
init_task(0号进程)是task_struct类型,是进程描述符。
3.rest_init()
通过rest_init()新建kernel_init和kthreadd内核线程。
kthreadd函数的任务是管理和调度其他内核线程kernel_thread。