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内核启动的入口
-在该函数被调用之前,内核代码主要是用汇编语言写的
-该函数初始化了整个系统的内核,是所有进程的祖先