5

我正在使用 Qemu 学习一些 linux 内核开发/hacking,并想调试 Linux (2.6.34.3) 的启动过程。我已经为 ARM 多功能平台进行了编译,并且正在使用 Codesourcerys arm-none-eabi 交叉编译器。我使用 Eclipse 作为使用 gdbserver 构建和调试的环境。

所以我已经成功地在 qemu 中构建并运行了内核,但问题是我在启动过程(地址 0)的调试器中没有看到任何源代码,我只能看到反汇编代码。但是,当它在 init/main.c(地址超过 0xC0000000)处切换到虚拟内存时,会出现源代码,我可以看到源代码并单步执行代码。这是为什么?我从一开始就想要那个。

有人对如何调试 Linux 的引导过程有任何提示吗?google 中的所有指南都显示了如何调试内核,但它们都显示在 start_kernel() (位于init/main.c中),而不是从引导过程的开始(在arch/arm/boot/compressed/head.c 中)。 )。请有经验的朋友帮忙,谢谢!

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

4

3 回答 3

7

Linux 内核使用两步引导处理(这不包括任何引导加载程序,如 u-Boot ...)。您可以更好地理解这一点,尤其是通过查看 2 个 .lds 文件(如下详述)进行链接:

  1. arch/arm/boot/compressed/vmlinux.lds.in, 生成arch/arm/boot/compressed/vmlinux.lds.

    与 中的其他 .o 文件一起arch/arm/boot/compressed,在此文件夹中生成一个 vmlinux。

    您可以使用arm-none-eabi-nm -a -n arch/arm/boot/compressed/vmlinux来查看此阶段的符号。所有地址都是物理地址。

    System.map 中不包含这些符号

  2. 第二个vmlinux是由内核.o文件和生成的arch/arm/kernel/vmlinux.lds(注意:路径不同)

我希望这能解释为什么您在 Eclipse 中看不到引导源代码。

于 2012-11-29T14:04:44.777 回答
2

linux内核太复杂而无法理解(对于初学者)。
为什么不使用像xv6这样更小的操作系统:

操作系统很小, 源码大约8000行
,很多大学
基于V6(unix)使用,
启动过程是一样的,只是比linux简单。
xv6的附录 B介绍了引导过程(简短而有趣)。您可以在 qemu 上运行 gdb 并查看引导过程,要检查的主要文件是 bootasm.S(在汇编程序中)和 bootmain.c。

与 linux 相比,这更简单、更容易理解。(至少对于初学者来说)。在给定的链接中,有关于、设置 qemu、使用 gdb、跟踪引导过程、对源代码进行更改等内容。试一试 :)

干杯,
莎朗

于 2012-07-11T02:20:04.787 回答
0

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

于 2012-07-11T00:33:44.260 回答