1

我正在分析 TI X-Loader 代码,以更深入地了解 omap cortex 启动序列。

我从 /cpu/omap3 文件夹中的 start.S 文件开始。第一行如下:

#include <config.h>
#include <asm/arch/cpu.h>

.globl _start
_start: 
    b   reset
    ldr pc, _hang
    ldr pc, _hang
    ldr pc, _hang
    ldr pc, _hang
    ldr pc, _hang
    ldr pc, _hang
    ldr pc, _hang

_hang:
    .word do_hang

    .word 0x12345678
    .word 0x12345678
    .word 0x12345678
    .word 0x12345678
    .word 0x12345678
    .word 0x12345678
    .word 0x12345678 /* now 16*4=64 */l

.global _end_vect
_end_vect:

异常向量(复位向量除外)将跳转到地址“_hang”。但是那里没有操作码,只有标签 do_hang 的地址(稍后在代码中找到,这是一个死循环函数)。我对 .word 的理解是,它将值(在我们的例子中是 do_hang 的地址)复制到二进制文件中的特定位置,在我们的例子中是地址“_hang”。当 PC 加载 _hang 时,程序执行跳转到地址 _hang,它没有找到操作码,而是找到一个地址值 (do_hang)。

我的问题:

  • 不应该有命令“b do_hang”而不是“.word do_hang”吗?
  • 当程序计数器指向一个不包含操作码但地址不应该导致系统崩溃的位置时?
  • .word 指令不应该只在 .data 部分有意义吗?

在此先感谢您的帮助。

马丁

4

1 回答 1

0

好的!我明白了,

命令是 LDR PC _hang!它不会跳转到 _hang,而是将 _hang 中的值加载到 PC 中。_hang中的值就是死循环函数do_hang的地址。

一个问题仍然存在:为什么不在每个向量中简单地“b do_hang”?好吧,我想我们永远不会知道。

问候

马丁

于 2014-01-29T08:50:49.067 回答