Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux kernel Qemu arm Linux内核引导调试,无源代码_Linux Kernel_Gdb_Arm_Qemu - Fatal编程技术网

Linux kernel Qemu arm Linux内核引导调试,无源代码

Linux kernel Qemu arm Linux内核引导调试,无源代码,linux-kernel,gdb,arm,qemu,Linux Kernel,Gdb,Arm,Qemu,我正在使用Qemu学习一些linux内核开发/破解,并希望调试linux(2.6.34.3)的引导过程。我已经为ARM通用平台进行了编译,并且正在使用CodeSourceRy的ARM none eabi交叉编译器。我使用Eclipse作为使用gdbserver构建和调试的环境 因此,我成功地在qemu中构建并运行了内核,但问题是,在启动过程中,我在调试器中看不到任何源代码(在地址0处),我只能看到反汇编代码。但是,当它在init/main.c(地址超过0xC0000000)切换到虚拟内存时,会出

我正在使用Qemu学习一些linux内核开发/破解,并希望调试linux(2.6.34.3)的引导过程。我已经为ARM通用平台进行了编译,并且正在使用CodeSourceRy的ARM none eabi交叉编译器。我使用Eclipse作为使用gdbserver构建和调试的环境

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

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

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


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

linux内核太复杂了(对于初学者来说)。
为什么不使用更小的操作系统,如:

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

与linux相比,这更简单、更容易操作和理解。(至少对于初学者来说是如此)。在给定的链接中有关于以下方面的帮助:设置qemu、使用gdb、跟踪启动过程、更改源代码等。试一试:)

干杯,

sharan

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由kernel.o文件和
    arch/arm/kernel/vmlinux.lds
    生成(注意:路径不同)


  • 我希望这可以解释为什么您在Eclipse中看不到启动源代码。

    是的,但在我的其他嵌入式项目中,我也可以使用我旁边的源文件调试汇编代码,并逐步执行。我也希望在Linux引导中使用它。谢谢你的提示,我已经调试了我的其他项目的其他引导过程,如裸机应用程序和freeRTOS。我现在非常渴望学习Linux:)最坏的情况是我必须在引导过程中阅读汇编:/为什么需要两阶段引导?转换发生在哪里?从v4.16开始,中的
    arch/arm/boot/compressed/vmlinux.lds.被重命名为
    arch/arm/boot/compressed/vmlinux.lds