《庖丁解牛》第3章——MenuOS的构造
3.1Linux内核源代码简介
计算机三大法宝:存储程序计算机、系统调用堆栈、中断
操作系统两把宝剑:中断切换上下文、进程切换上下文
Linux内核源码的目录结构
其中,arch目录是与体系结构相关的子目录列表,里面存放了许多CPU体系结构的相关代码,使得Linux内核可以支持不同的CPU和体系结构(指令集)。我们重点关注x86目录
init目录存放内核启动时的初始化代码,/init/main.c中的start_kernel是Linux内核启动的起点。
3.2构造一个简单的Linux内核
在“实验楼”环境下构造MenuOS
根文件系统一般包括内存根文件系统和磁盘文件系统。
initrd即 initial ramdisk,普通用户一般感知不到这个内存根文件系统的存在,因为内核启动时先访问initrd文件系统(内存根文件系统),然后在切换到磁盘文件系统。图为构建Linux系统MenuOS
3.3跟踪调试Linux内核的启动过程
输入命令qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -S -s
,内核被冻结
在start_kernel()处设置断点
3.4内核代码分析
start_kernel()
start_kernel()是内核启动的起点,在此函数被调用前内核代码主要用于完成硬件系统初始化工作。在start_kernel()中几乎完成了内核所有模块初始化工作。在这其中,最先生成的是0号进程(init_task)
init_task
init_task(pid=0),类型是tast_struct,使用宏INIT_TASK进行初始化。
rest_init()
rest_init()新建kernel_init和kthreadd内核线程
405行用Kernel_thread执行kthreadd,创建PID=2的内核线程
实践中学习到的其他知识
在自己的机器上搭建MenuOS的时候,第一步就是要先下载Linux内核源码。在下载快要完成的时候网络中断,内心非常崩溃,又不甘心重新下载,因为网速实在是太慢了(微笑),所以我赶紧查了查wget的功能,想着还可以抢救一下。下图是wget下载中断后的样子,在固定的时间长度下会自动发送一个request并等待服务器的response。
wget在默认情况下是不支持续传的,如果下载的时候网络中断,这时候再用wget不会续传而是生成一个名为重复文件名1的文件
那么wget是否支持继续传输呢?如何继续传输?
老师说过只要想清楚问题就已经找到了答案
输入wget -c 下载地址
就可以续传之前下载中断的文件了,结果如图所示
更多wget的参数及用法
没有解决的问题
1.compiler-gcc7.h找不到文件或目录
在自己的虚拟机上安装MenuOS的时候,遇到了这样的问题
查询linux-3.18.6的源码并没有找到compiler-gcc7.h
在网上搜了一下也没有找到compiler-gcc7.h,不知道大家有没有好的解决方法。
2.init_task究竟是一个变量还是一个方法呢
在《庖丁解牛》中把init_task
写成了一个方法,但是start_kernel()
中的代码是set_task_stack_end_magic(&init_task);