《Linux内核分析》第三周学习小结 构造一个简单的Linux系统OS
郝智宇 无转载 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
第三周
构造一个简单的Linux系统MenuOS
一、Linux内核源代码简介
- 三个法宝和两把宝剑:
(1) 三个法宝:存储程序计算机、函数调用堆栈、终断
(2) 操作系统的两把宝剑:中断上下文的切换(保存现场和恢复现场)、进程上下文的切换
- arch/x86目录下的代码是我们重点关注的
- init目录:内核启动相关的代码基本都在init目录下
main.c在init目录中
4. kernel: start_kernel函数相当于普通C程序的main函数
Linux内核的核心代码在kernel目录中
二、构造一个简单的Linux系统MenuOS
- Init是第一个用户态进程,是1号进程
- 用实验楼构造
有关help命令的参数与说明:
三、跟踪调试Linux内核的启动过程
1.使用gdb跟踪调试Linux内核的方法:
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S # 关于-s和-S选项的说明:
// -S freeze CPU at startup
(use ’c’ to start execution) cpu初始化之前把它冻结起来
// -s shorthand for -gdb
tcp::1234 在1234端口上建立了一个gdb
server
若不想使用1234端口,则可以使用-gdb tcp:xxxx来取代-s选项
结果:
另开一个shell窗口:
输入gdb,打开;加载符号表;连接到刚刚被冻结的Linux系统;设置断点
输入c继续执行:
输入list查看断点处的代码:
2.简单分析一下start_kernel
init_task即手工创建的,0号进程即最终的idle进程
不管分析内核的哪一部分都会涉及到start_kernel
当系统没有进程需要执行时就调度到idle进程
一、总结
对Linux系统启动过程的理解:
有一个全局变量init_task,即手工创建的PCB,0号进程,即最终的idle进程。Kernelthread是0号进程,它创建了1号进程kernelinit,以及它的一些服务的内核线程,
这样整个系统启动起来了。
rest_init()中有kernel_thread(kernel_init,NULL,CLONE_FS)
kernel_init中有run_init_process,
run_init_process创建了1号进程