一文学会Linux内核的编译和调试( 二 )

我们也可以先不加-s和-S参数,测试验证一下编译的Linux内核是否能正常启动:

  • qemu-system-x86_64 -kernel ./bzImage -initrd ./rootfs.img -append "nokaslr console=ttyS0" -nographic
QEMU虚拟机启动参数说明如下:-kernel ./bzImage:指定启用的内核镜像;-initrd ./rootfs.img:指定启动的内存文件系统;-append "nokaslr console=ttyS0":附加参数,其中 参数必须添加进来,防止内核起始地址随机化,这样会导致 gdb 断点不能命中;参数说明可以参见这里 。nokaslr-s:监听在 gdb 1234 端口;-S:表示启动后就挂起,等待 gdb 连接((CPU 初始化之前冻结起来);-nographic:不启动图形界面,调试信息输出到终端与参数 组合使用;console=ttyS如果要退出QEMU虚拟机,可以先按ctrl + a键,然后再按x键,即可退出QEMU 。 3.3 gdb调试Linux内核编译Linux内核时,会生成一个vmlinux文件,vmlinux是Linux内核编译出来的原始的内核文件,可以用来进行调试内核和定位内核问题 。gdb开始调试,设置远程调试的端口1234:
  • cd /usr/src/linux-6.4.11/gdb vmlinuxtarget remote :1234

一文学会Linux内核的编译和调试

文章插图
跟gdb调试普通程序一样,我们可以设置一下断点,然后按c键继续运行:
  • b start_kernelb rest_initc
可以看到gdb在start_kernel和rest_init两个函数断点处停住了,按c键后,QMUE虚拟机成功进入了系统 。start_kernel是Linux内核启动时C代码开始的地方,研究内核启动过程就可以从start_kernel开始看 。
一文学会Linux内核的编译和调试

文章插图




推荐阅读