我正在分析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"。但是那里没有OP代码,但只有标签do_hang的地址(在代码后面找到,并且是一个死循环函数)。我对.word的理解是,它将值(在我们的情况下,do_hang的地址)复制到二进制中的特定位置,在我们的情况下,在地址" _hang"中。当PC加载_hang时,程序执行会跳到地址_HANG,并且在那里找不到OP代码,而是一个是地址的值(do_hang)。
我的问题:
- 不应该有命令" b do_hang"而不是" .word do_hang"?
- 当程序对抗指向不包含opcode的位置时,地址不应该导致系统崩溃?
- 不应该在.DATA部分? 中才有意义
事先感谢您的帮助。
马丁
好!我明白了,
命令是ldr pc _hang!它不会跳到_hang,而是将值加载到PC中。_hang中的值是Dead Loop函数DO_HANG的地址。
仍然存在一个问题:为什么不简单地在每个向量中" b do_hang"呢?好吧,我想我们永远不会知道。
问候
马丁