Qemu arm Linux内核启动调试,没有源代码

时间:2012-07-11 00:09:10

标签: linux-kernel gdb arm qemu

我正在使用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 )而不是从启动过程开始(在中)拱/臂/引导/压缩/ head.S中)。有经验的人请帮忙,谢谢!

  

查看根文件夹中的System.map,并且只有来自c0004000(虚拟地址开始)的内容的符号。我将vmlinux加载到gdbserver中以获取调试信息,也许这就是为什么没有源代码?

3 个答案:

答案 0 :(得分:7)

Linux内核使用两步启动处理(这不包括任何启动加载程序,如u-Boot ...)。你可以更好地理解这一点,特别是通过查看2个.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生成(注意:路径不同)

  3. 我希望这能解释为什么你无法在Eclipse中看到启动源代码。

答案 1 :(得分:1)

linux内核太复杂了(对初学者来说) 为什么不使用像xv6这样的小型操作系统:

操作系统很小,sourcecode约为8000行  许多大学使用的  基于V6(unix),
启动过程是相同的,除了它不如linux复杂 xv6 book的附录B涉及启动过程(它的简短和甜蜜)。你可以在qemu上运行gdb并查看启动过程,要检查的主要文件是bootasm.S(在汇编程序中)和bootmain .C。

与linux相比,这更简单,更易于理解。(至少适合初学者)。有开发人员,设置qemu,使用gdb,跟踪启动过程,更改源代码等。给出链接。给它一个镜头:)

干杯,
夏朗

答案 2 :(得分:0)

head.S是用汇编语言编写的,而不是C.这就是.S后缀表示的内容。