20199314 Linux内核原理与分析 第四周作业
MenuOS的构造
一、Linux内核源代码简介
Linux内核源码的目录结构如图
其中包含了很多子目录,存放了不同类型的代码。
-
arch: 这个为目录是架构相关,里面存放了许多CPU架构,比如arm,x86,MIPS,PPC等。本次学习主要基于X86系统,故重点关注X86目录。
-
block: 在linux中block表示块设备(以块(多个字节组成的整体,类似于扇区)为单位来整体访问),譬如说SD卡、iNand、Nand、硬盘等都是块设备。你几乎可以认为块设备就是存储设备。block目录下放的是一些linux存储体系中关于块设备管理的代码。
-
crypto: 英文意思是加密。这个目录下放了一些各种常见的加密算法的C语言代码实现。譬如crc32、md5、sha1等。
-
Documentation: 里面放了一些文档。
-
drivers: 驱动目录,里面分门别类的列出了linux内核支持的所有硬件设备的驱动源代码。就是需要重点学习的部分。
-
firmware: 固件。什么是固件?固件其实是软件,不过这个软件是固话到IC里面运行的叫固件:就像S5PV210里的iROM代码。
-
fs: fs就是file system,文件系统,里面列出了linux支持的各种文件系统的实现。
-
include: 头文件目录,公共的(各种CPU架构共用的)头文件都在这里。每种CPU架构特有的一些头文件在arch/arm/include目录及其子目录下。
-
init: init是初始化的意思,这个目录下的代码就是linux内核启动时初始化内核的代码。
二、 Linux内核启动的起点问题
众所周知,高级语言和汇编语言中,阅读首先要从main.c函数开始,通过其中main函数启动、切换进程。但是Linux内核中虽然有main.c函数,然而其是先通过start_kernel函数启动。
三、构造一个简单的内核--MenuOS(实验楼环境下)
步骤: 将Linux系统和一个简单的文件系统运行起来。
先用qemu仿真kernel,bzImage是vmLinux经过gzip压缩后的文件,是压缩的内核映像。bImage和zImage分别代表大小内核。根文件系统initrd用rootfs.img代替。
代码如下:
$ cd ~/LinuxKernel/
$ qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img
由于在自己电脑上构建Linux内核的过程,网速太慢,下载不成功就没下载。
四、利用gdb跟踪调试内核
跟踪gbd调试内核的过程,需要执行如下代码:
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S
其中-s代表在gpu初始化前冻结起来,-s代表默认使用1234端口上创建一个gdb-server。
在gdb界面中targe remote之前加载符号表,并用1234这个端口进行连接,代码如下:
(gdb)file linux-3.18.6/vmlinux
target remote:1234
五、总结
进程创建中主要的三个进程为init_task()、kernel_init()、kthreadd()。分别为0、1、2号进程。其中init_task()初始进程衍生出kernel_init()、kthreadd()两者,而前者运行用户进程,后者运行内核守护进程。