1.操作系统的两把宝剑和三大法宝
两把宝剑:一把是中断上下文的切换——保存现场和恢复现场;另一把是进程上下文的切换。
三大法宝:存储程序计算机、函数调用堆栈机制、中断。
2.源代码根目录的几个关键目录
include:头文件目录,存放公共的(各种CPU体系结构共用的)头文件。比如ARM架构特有的一些头文件在arch/arm/include目录及其子目录下。
init:init是初始化的意思,存放Linux内核启动时的初始化代码。
ipc目录:IPC就是进程间通信,ipc目录里面是linux支持的ipc的代码实现。
lib目录:公用的库文件,里面是一些公用的库函数。这里的lib目录下的库函数就是用来替代标准库函数的。
3.构造一个简单的linux内核
采用如下命令行将Linux系统和一个简单的文件系统运行起来。
$ cd ~/LinuxKernel/
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img
构建Linux系统MenuOS
qemu仿真kernel;bzImage是vmLinux经过gzip压缩后的文件,是压缩的内核映像。 使用gdb进行调试,首先将内核启动,然后冻结。再另外打开一个窗口,启动gdb,把内核加载进来。
(gdb)target remote:1234,用1234这个端口进行连接
(gdb)break start_kernel
在start_kernel设置断点
此时输入c运行,代码停留在start_kernel处
在github上查看start_kernel代码
在rest_init处设置断点
在github上查看rest_init()代码
kthread函数的任务是管理和调度其他内核线程kernel_thread。init_task()为创建init进程后,调用cpu_idle()
演变成了idle进程,执行一次调度后,init进程运行。1号内核线程负责执行内核的部分初始化工作及进行系统配置,最后调用
do_execve加载init程序,演变成init进程,init进程是内核启动的第一个用户态进程。kthreadd(PID为2)进程由0号进程
创建,始终运行在内核空间,负责所有内核线程的调度和管理。