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

MenuOS的构造

一:Linux内核源码结构

linux内核源码如下(实验所用的linux-3.18.6版本)

其中,arch目录包括了所有和体系结构相关的核心代码。它下面的每一个子目录都代表一种Linux支持的体系结构,例如i386就是Intel CPU及与之相兼容体系结构的子目录。PC机一般都基于此目录。

include目录包括编译核心所需要的大部分头文件,例如与平台无关的头文件在include/linux子目录下。

init目录包含核心的初始化代码(不是系统的引导代码),有main.c和Version.c两个文件。

drivers目录中是系统中所有的设备驱动程序。它又进一步划分成几类设备驱动,每一种有对应的子目录,如声卡的驱动对应于drivers/sound。

documentation目录下是一些文档,是对每个目录作用的具体说明。

还比较重要的一些目录,例如lib目录种包含了核心的库代码、net目录种是核心的网络部分代码、mm目录包含了所有的内存管理代码、modules目录存放了已建好的并可动态加载的模块等等。

二:构造一个简单的Linux系统MenuOS

1.使用实验楼的虚拟机打开shell,并通过以下命令打开MenuOS

-cd ~/LinuxKernel/
-qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img

2.通过以下命令使用gdb跟踪调试内核

-qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S
-s参数的作用分别是在1234端口上创建一个gdb-server,可以再另外打开一个窗口用gdb把带有符号表的内核镜像加载进来,然后连接gdb srever 设置断点追踪内核
-S参数的作用是在CPU开始之前把他冻结起来。

3.另外打开一个shell窗口,并输入以下命令

-gdb
-(gdb) file linux-3.18.6/vmlinux # 在gdb界面中targe remote之前加载符号表
-(gdb) target remote:1234 # 建立gdb和gdbserver之间的连接,按c 让qemu上的Linux继续运行
-(gdb) break start_kernel # 断点的设置可以在target remote之前,也可以在之后

三:start_kernel函数分析

-该函数相当于C语言中的main函数,是linux内核启动的入口
-在该函数被调用之前,内核代码主要是用汇编语言写的
-该函数初始化了整个系统的内核,是所有进程的祖先
原文地址:https://www.cnblogs.com/j1551163790/p/11629195.html