Linux内核分析第三周 构造一个简单的Linux系统MenuOS
前提回顾
1.计算机是如何工作的三个法宝
1.存储程序计算机
2.函数调用堆栈
3.中断
2.操作系统的两把宝剑
- 中断上下文的切换
- 进程上下文的切换
第一讲 Linux内核源代码介绍
arch目录包括了所有和体系结构相关的核心代码。它下面的每一个子目录都代表一种Linux支持的体系结构,例如i386就是Intel CPU及与之相兼容体系结构的子目录。PC机一般都基于此目录。
init目录包含核心的初始化代码(不是系统的引导代码),有main.c和Version.c两个文件。这是研究核心如何工作的好起点。
start_kernel函数之前的内容基本都是汇编语言,而从该函数开始内核进入c语言部分,功能则是内核主要功能的初始化。
Kernel内核管理的核心代码放在这里。同时与处理器结构相关代码都放在arch/*/kernel目录下。
第二讲 实验 构建一个简单的Linux内核
1.使用实验楼的虚拟机打开shell
cd LinuxKernel
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img
qemu:启动一个虚拟机平台
-kernel:给一个内核,操作系统
-initrd:驱动所需的硬盘
rootfs.img:放一个可执行文件由menuOS源代码编译成的init
内核启动完成后进入menu程序支持三个命令help、version和quit
2.通过gdb跟踪内核的启动
设置断点在start_kernel
设置断点在rest_init
总结:
start_kernel到init进程启动:
内核几乎所有模块的初始化都会经过start_kernel来进行
1 /*init_task即手工创建的PCB,0号进程就是最终的idle进程*/ 2 set_task_stack_end_magic(&init_task); 3 ........ 4 /*初始化中断向量*/ 5 trap_init(); 6 /*内存管理模块初始化*/ 7 mm_init(); 8 /*调度模块初始化*/ 9 sched_init(); 10 .... 11 /*其他初始化*/ 12 rest_init()
进程启动过程图(来自http://img.blog.csdn.net/20140405154332828?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhneGh1YWE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
rest_init()最后执行cpu_startup_entry();cpu_startup_entry会调用cpu_idle_loop(), 在cpu_idle_loop()里面有个while(1)的循环一直执行,作为idle进程,pid是0号,此进程会一直执行下去,并且在系统没有任何需要执行的进程时,调度到此进程。
Linux内核的启动在宏观上来看,就是start_kernel()来进行各种初始化工作,最终执行到rest_init()来初始化0号进程和1号用户态的进程。然后操作系统就运行起来了。
郭皓原创作品转载请注明出处 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000