(2023-2024-1)20232830《Linux内核原理分析与设计》第四周作业
1. 《庖丁解牛Linux分析》第4章
系统调用中的进程调度时机
2. 实验三:跟踪分析 Linux 内核的启动过程
2.1 启动Linux内核
切换路径,并启动内核;
cd ~/LinuxKernel/
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img
2.2 使用gdb跟踪调试内核
在原有命令的基础上增加“-S -s”;冻结CPU;
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -S -s
打开另一个shell窗口,开始跟踪调试;
在gdb界面中targe remote之前加载符号表:file LinuxKernel/linux-3.18.6/vmlinux
建立gdb和gdbserver之间的连接,按c 让qemu上的Linux继续运行:target remote:1234
断点的设置可以在target remote之前,也可以在之后:break start_kernel
以上已与端口1234建立连接,并在start_kernel处打上断点;
按c 让qemu上的Linux继续运行,启动到start_kernel位置;
跟踪完成,使用“list”可查看start_kernel的上下文代码。
3. 总结
start_kernel 是 Linux 内核启动的入口函数,它负责进行一系列的初始化工作,包括硬件初始化、内存管理的建立、中断系统的初始化、系统调用的初始化等。其中,rest_init 函数的作用是创建系统的第一个用户态进程,也就是 PID 为 1 的 kernel_init 进程。
具体流程可以总结如下:
start_kernel 函数: 是 Linux 内核启动的入口函数,负责进行整个内核的初始化工作;
rest_init 函数: 在 start_kernel 中被调用,创建了 PID 为 1 的 kernel_init 进程。这是第一个用户态进程;
kernel_init 进程: 是用户态的第一个进程,它负责进行更多的系统初始化工作,例如创建系统中其他的进程;
cpu_idle_loop 函数: rest_init 调用之后,系统进入 idle 循环,等待处理中断。当系统没有进程需要处理时,就会转入 idle 进程,保持系统的运行;
总体而言,start_kernel 函数标志着 Linux 内核的启动过程,而这个过程确保了系统的核心部分的初始化和启动。