实验楼-第四周作业
跟踪分析 Linux 内核的启动过程
1、启动实验楼内核
使用指令 qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S
打开QEMU并启动Linux内核,其中-s 使得启动QEMU时自动开启一个GDB服务器,并允许通过GDB 1234接口连接到QEMU实例
-S选项使 QEMU 在启动时暂停 CPU 的执行,等待 GDB 的连接。可以使用 GDB 的 continue
命令来继续执行 CPU,允许我们在调试器中事先设置好断点
如图所示,内核启动后被冻结,等待GDB连接
2、通过GDB连接内核进程
3、调试Linux内核启动进程
(1)设置调试断点
在启动内核进程前,设置关键函数的断点,查看函数所属的进程部分和相关功能,以及函数的执行频率
(2)continue执行内核启动进程
1*初始化体系结构,完成架构相关的初始化,设置内存映射、初始化 CPU
2*初始化时钟和时间管理系统
3*内存管理系统初始化
4*中断系统初始化
5*进程调度系统初始化
6*其他核心子系统初始化
在rest_init 函数中,设置断点break kernel_thread、break kernel_init
Kernel_init完成了一些额外的初始化工作,并最终启动用户态的 init
进程
4、总结
start_kernel
:核心的硬件初始化和内核子系统初始化。
setup_arch
:架构相关的硬件初始化。
mm_init
:内存管理系统的初始化。
sched_init
:进程调度器初始化。
rest_init
:启动内核线程和 init
进程。
kernel_init
:加载用户空间的 init
程序,完成最终初始化。
5、问题
1&Kernel_thread函数执行频率:
在通过GDB对Linux内核启动进行调试的过程中,针对Kernel_thread 的断点多次触发,最后不得不删除了该断点检测:
内核启动初始化过程中,kernel_thread
函数多次执行的主要目的是为系统创建并初始化多个内核线程,以满足系统运行的不同需求。内核线程需要面临初始化系统服务中的多个并发处理需求,此在内核启动服务中起到了比较底层的支撑作用,导致了kernerl_thread需要多次执行以满足后续服务的需要