2019-2020-1 20199305《Linux内核原理与分析》第四周作业
MenuOS的构造
一.Linux源代码的关键目录
-
block:存放块设备管理代码;
-
crypto:存放常见加密算法的C语言代码;
-
Documentation:存放一些文档;
-
drivers:驱动目录;
-
firmware:固件;
-
fs:文件系统;
-
include:头文件目录;
-
init:存放Linux内核启动时的初始化代码;
-
Kernel:存放内核本身需要的一些核心代码文件;
-
lib:公用的库文件;
-
mm:存放Linux的内存管理代码;
-
net:存放网络相关的代码;
二.构造一个简单的Linux内核
(1)使用以下指令来搭建MenuOS
cd ~/LinuxKernel/
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img
(2)使用GDB来跟踪调试Linux内核的启动过程
使用GDB追踪调试时需要加两个参数,一个是-s(在1234端口上创建了一个gdb-server),
一个是-S(CPU初始化之前冻结起来)。
- 用以下命令把内核启动一下,可观察到它被冻结
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S
-
再打开一个水平分割的窗口,启动gdb,把内核加载进来,建立连接
在start_kernel和rest_init两处设置断点,可按“c”继续执行
-
start_kernel()部分代码
asmlinkage __visible void __init start_kernel(void)
{
char *command_line;
char *after_dashes;
/*
* Need to run as early as possible, to initialize the
* lockdep hash:
*/
lockdep_init();
set_task_stack_end_magic(&init_task);
smp_setup_processor_id();
debug_objects_early_init();
.............
/* Do the rest non-__init'ed, we're now alive */
rest_init();
}