Linux内核分析第三周——构造一个简单的Linux系统MenuOS
范闻泽 + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000




对start_kernel进行分析
1. init/main.c -> stat_kernel
asmlinkage void __init start_kernel(void)该函数是Linux内核的入口。
start_kernel()是内核的汇编与C语言的交接点,在该函数以前,内核的代码都是用汇编写的,完成一些最基本的初始化与环境设置工作。
在start_kernel()中Linux将完成整个系统的内核初始化。内核初始化的最后一步就是启动init进程,这个所有进程的祖先。
不管分析内核那一部分都会涉及到start_kernel,因为几乎所有模块在初始化时都会调用它。
2. 一些init函数
(1)全局变量 init_task
全局变量init_task,即手工创建的PCB,0号进程初始化,0号进程就是最终的idle。
(2)初始化一些中断向量 trap_init()
中断向量表的初始化函数,设置了很多中断门(Interrupt Gate)set_intr_gate:设置中断门
(3)内存管理模块初始化 mm_init()
(4)调度模块初始化 sched_init()
函数内做了很关键的一步初始化——对0号进程,即idle进程进行初始化。
(5)其它模块初始化 rest_init()
kernel_thread``(kernel_init,NULL,CLONE_FS)中的kernel_init包含一个run_init_process,创建了一号进程,即第一个用户态进程。之后创建了kthread,一个内核线程来管理系统的资源。
各部分启动完毕后,调用static void cpu_idle_loop(void),当系统没有进程需要执行时就调度到idle进程中的cpu_idle_loop,其中while(1)无限循环,即rest_init的中0号进程会一直存在。
总结:
操作系统两把宝剑:
- 1、中断上下文的切换:保存现场和恢复现场
- 2、进程上下文的切换
浙公网安备 33010602011771号