1

我正在尝试通过 AM3517 评估板上的 JTAG 加载和启动 linux 内核。我的调试器是 BDI3000。我没有使用 openocd,因为根据调试器的文档,它不是必需的。到目前为止,我认为我能够将 vmlinux 映像加载到内存中,但是一旦完成,“cont”gdb 命令就不会启动 linux。我没有在串行控制台上收到任何消息。

我正在按照此链接http://elinux.org/Debugging_The_Linux_Kernel_Using_Gdb中给出的说明进行操作

尝试获取链接中提到的 log_buffer 的地址给了我以下输出

(gdb) p (char*) &__log_buf[log_start]
$1 = 0xc04cd460 <Address 0xc04cd460 out of bounds>

我在互联网上搜索了很多,但找不到正确的答案。不知道我做错了什么。

4

1 回答 1

2

Linux 内核不能只是加载然后执行。
在 Linux 内核可以执行之前,ARM 架构需要一个引导加载程序:

  • 配置内存系统。
  • 在正确的内存地址加载内核映像。
  • 可以选择在正确的内存地址加载初始 RAM 磁盘。
  • 初始化引导参数以传递给内核(又名内核命令行)。
  • 获取 ARM Linux 机器类型(以及 ATAG 的其他信息)
  • 使用适当的寄存器值输入内核。

这些步骤中的大多数对所有架构都是通用的,但系统信息的 ATAG 列表是 ARM 独有的。“引导 ARM Linux”
中提到了所有这些引导要求。 通常,引导加载程序(例如 U-Boot)执行这些任务。 你提到的教程告诉你使用引导加载程序来初始化你的板:

最实用的方法是在内核启动时设置硬件断点
并使用 JTAG 复位信号复位您的电路板。
您的引导加载程序将初始化您的电路板,并且执行将在内核启动时停止。
之后,您可以将内核加载到内存中并运行它。

于 2013-02-18T19:40:28.067 回答