[英]Qemu arm Linux kernel boot debug, no source code
我正在使用Qemu学习一些Linux内核开发/黑客,并希望调试Linux的启动过程(2.6.34.3)。 我已经为ARM多功能平台编译并使用Codesourcerys arm-none-eabi交叉编译器。 我使用Eclipse作为使用gdbserver构建和调试的环境。
所以我已经成功地在qemu中构建并运行内核,但问题是我在启动过程中没有看到调试器中的任何源代码 (在地址0),我只能看到反汇编代码。 但是,当它在init / main.c(地址超过0xC0000000)切换到虚拟内存时,会出现源代码,我可以看到源代码并逐步完成代码。 这是为什么? 我从一开始就想要那个。
任何人都有关于如何调试Linux的启动过程的任何提示? 谷歌中的所有指南都显示了如何调试内核,但它们都显示在start_kernel()(位于init / main.c中 )而不是从启动过程的开始(在arch / arm / boot / compressed / head中)。 S )。 有经验的人请帮忙,谢谢!
查看根文件夹中的System.map,并且只有来自c0004000(虚拟地址开始)的内容的符号。 我将vmlinux加载到gdbserver中以获取调试信息,也许这就是为什么没有源代码?
Linux内核使用两步启动处理(这不包括任何启动加载程序,如u-Boot ...)。 你可以更好地理解这一点,特别是通过查看2个.lds文件(详见下文)进行链接:
arch/arm/boot/compressed/vmlinux.lds.in
,生成arch/arm/boot/compressed/vmlinux.lds
。
与arch/arm/boot/compressed
其他.o文件一起,在此文件夹中生成vmlinux。
您可以使用arm-none-eabi-nm -a -n arch/arm/boot/compressed/vmlinux
来查看此阶段的符号。 所有地址都是物理地址。
这些符号不包含在System.map中
第二个vmlinux由内核.o文件和arch/arm/kernel/vmlinux.lds
(注意:路径不同)
我希望这能解释为什么你无法在Eclipse中看到启动源代码。
head.S是用汇编语言编写的,而不是C.这就是.S后缀表示的内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.