实验三:跟踪分析Linux内核的启动过程
1、使用实验楼的虚拟机打开shell,代码如下
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
运行结果
使用ChatGPT来解释这段代码的理解 以及说明-s 和-S的选项
打开gdb调试器,建立gdb和gdbserver之间的连接。断点被设置在start_kernel
3、总结:
使用 gdb 跟踪调试内核从 start kernel 到 init 进程启动方法
-
准备内核和QEMU:
- 编译Linux内核,确保启用了GDB支持。
- 使用QEMU启动虚拟机,像之前提到的那样,使用
-s
和-S
选项。
-
在虚拟机外部,使用GDB连接到虚拟机的GDB服务器:
gdb (gdb) target remote localhost:1234
这将连接到QEMU的GDB服务器,其中
localhost
是虚拟机的主机名,1234
是GDB服务器的默认端口。 -
从启动内核到init进程启动:
a. 首先,让内核执行到启动点。使用以下命令继续内核的执行:
(gdb) continue
b. 内核将执行启动过程,直到启动init进程。在这个过程中,您可以使用GDB的调试命令来观察和跟踪内核的执行。例如,使用
break
命令设置断点,使用step
命令单步执行代码,使用info registers
命令查看寄存器状态等。c. 通常,内核启动过程中的关键点包括
start_kernel
函数的调用,启动初始化进程(通常是/sbin/init
)等。您可以设置断点以在这些关键点停止内核的执行并检查状态。d. 当您到达
init
进程启动的关键点时,您可以查看用户空间进程的调试信息。如果需要,您可以继续跟踪用户空间的进程,就像在普通用户空间程序上一样。 -
使用GDB的其他功能来进一步分析内核的行为,如查看内存、堆栈、变量等。