2018-2019-1 20189204《Linux内核原理与分析》第四周作业

《庖丁解牛》第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

2018-2019-1 20189204《Linux内核原理与分析》第四周作业_第1张图片

3.3跟踪调试Linux内核的启动过程

输入命令qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -S -s,内核被冻结
在start_kernel()处设置断点
2018-2019-1 20189204《Linux内核原理与分析》第四周作业_第2张图片

在gdb模式下按c继续
2018-2019-1 20189204《Linux内核原理与分析》第四周作业_第3张图片

在rest_init()处设置断点并继续
2018-2019-1 20189204《Linux内核原理与分析》第四周作业_第4张图片

3.4内核代码分析

start_kernel()

start_kernel()是内核启动的起点,在此函数被调用前内核代码主要用于完成硬件系统初始化工作。在start_kernel()中几乎完成了内核所有模块初始化工作。在这其中,最先生成的是0号进程(init_task)

init_task

init_task(pid=0),类型是tast_struct,使用宏INIT_TASK进行初始化。
2018-2019-1 20189204《Linux内核原理与分析》第四周作业_第5张图片

rest_init()

rest_init()新建kernel_init和kthreadd内核线程
405行用Kernel_thread执行kthreadd,创建PID=2的内核线程
2018-2019-1 20189204《Linux内核原理与分析》第四周作业_第6张图片

实践中学习到的其他知识

在自己的机器上搭建MenuOS的时候,第一步就是要先下载Linux内核源码。在下载快要完成的时候网络中断,内心非常崩溃,又不甘心重新下载,因为网速实在是太慢了(微笑),所以我赶紧查了查wget的功能,想着还可以抢救一下。下图是wget下载中断后的样子,在固定的时间长度下会自动发送一个request并等待服务器的response。

2018-2019-1 20189204《Linux内核原理与分析》第四周作业_第7张图片

wget在默认情况下是不支持续传的,如果下载的时候网络中断,这时候再用wget不会续传而是生成一个名为重复文件名1的文件
那么wget是否支持继续传输呢?如何继续传输?
老师说过只要想清楚问题就已经找到了答案
输入wget -c 下载地址 就可以续传之前下载中断的文件了,结果如图所示
2018-2019-1 20189204《Linux内核原理与分析》第四周作业_第8张图片

更多wget的参数及用法

没有解决的问题

1.compiler-gcc7.h找不到文件或目录

在自己的虚拟机上安装MenuOS的时候,遇到了这样的问题
2018-2019-1 20189204《Linux内核原理与分析》第四周作业_第9张图片
查询linux-3.18.6的源码并没有找到compiler-gcc7.h
2018-2019-1 20189204《Linux内核原理与分析》第四周作业_第10张图片
在网上搜了一下也没有找到compiler-gcc7.h,不知道大家有没有好的解决方法。

2.init_task究竟是一个变量还是一个方法呢

在《庖丁解牛》中把init_task写成了一个方法,但是start_kernel()中的代码是set_task_stack_end_magic(&init_task);

你可能感兴趣的:(2018-2019-1 20189204《Linux内核原理与分析》第四周作业)