Qemu arm Linux内核引导调试,没有源代码

5
我正在使用Qemu学习一些Linux内核开发/黑客技术,并希望调试Linux(2.6.34.3)的引导过程。我已经为ARM versatile平台编译了代码,并使用Codesourcery的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中以获取调试信息,也许这就是为什么没有源代码的原因?
3个回答

7
Linux内核使用两步引导过程(不包括像u-Boot这样的引导加载程序...)。您可以通过查看以下两个链接的.lds文件更好地理解此过程:
1. 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中。
2.第二个vmlinux由内核.o文件和arch/arm/kernel/vmlinux.lds生成(注意:路径不同)
希望这解释了为什么您无法在Eclipse中看到引导源代码。

为什么需要两阶段引导?开关在哪里发生?截至v4.16,arch/arm/boot/compressed/vmlinux.lds.in已更名为arch/arm/boot/compressed/vmlinux.lds.S - Ciro Santilli OurBigBook.com

2
Linux内核对于初学者来说太复杂了。为什么不使用一个更小的操作系统,比如xv6
操作系统很小, 源代码 大约有8000行,被许多大学使用,基于V6(unix),启动过程与Linux相比较简单。xv6 书籍 的附录B介绍了引导过程(简短而精炼)。您可以在qemu上运行gdb并查看引导过程,需要检查的主要文件是bootasm.S(汇编语言)和bootmain.c。
与Linux相比,这要简单得多且更易于理解(至少对初学者来说)。在给定的链接中,有关于设置qemu、使用gdb、跟踪启动过程、对源代码进行更改等方面的任务。试一试吧 :)
祝好, Sharan

谢谢你的建议,我已经调试了其他项目的引导过程,比如裸机应用和freeRTOS。现在我非常渴望学习Linux :) 最坏的情况是我必须通过引导过程阅读汇编代码:/ - MrGigu

0

head.S是用汇编语言编写的,而不是C语言。这就是“.S”后缀的含义。


1
是的,但在我的其他嵌入式项目中,我也可以在旁边有源文件调试汇编代码并逐步执行和跳过。我也希望在Linux启动时能够做到这一点。 - MrGigu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接