1

在我的 ARM9 汇编启动代码中,我有一些我不理解的行,如下所示:

    .word   0x41676d69
    .word   0,0,0,0,0
image_type:
    .word   0x0000000A
sizeOfPermanentCode:    
    .word   (__image_size)
    .word   0,0
bootparameter:  
    .word   0
    .word   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

我听说数字 0x41676d69 是某种图像幻数,但我不知道为什么要使用它。其他 .word 元素呢?这些是什么?他们在做什么?

诚挚的问候 Žiga Lausegger

4

1 回答 1

3

从我所看到的,启动映像在开始时应该看起来像这样......

+--------------------------+
|      (asm) B Start       | 0x00
+--------------------------+ 
|    Magic (0x41676d69)    | 0x04
+--------------------------+
| code CRC (if type=0x0b)  | 0x08
+--------------------------+
|                          | 0x0c
+--                      --+
|                          |
+--       Reserved       --+
|        (set to 0)        |
+--                      --+
|                          |
+--------------------------+
| image type(0x0a or 0x0b) | 0x1c
+--------------------------+
| image size (incl header) | 0x20
+--------------------------+
| image version (ignored)  | 0x24
+--------------------------+
|   build time (ignored)   | 0x28
+--------------------------+
|  "boot parameter" (..?)  | 0x2c
+--------------------------+
:                          : 0x30
.                          .
  it gets fuzzy from here. 
  Looks like this is yours 
  to do what you want with 
.                          .
:                          :
+--------------------------+
| header CRC(if type=0x0a) | 0x6c
+--------------------------+ 
|                          | 0x70
+--                      --+
|                          |
+--       Reserved       --+
|        (set to 0)        |
+--                      --+
|                          |
+==========================+
|  boot code starts here   | 0x80

B Start是到引导代码入口点的跳转指令。该切入点主要取决于您。

0x41676d69告诉引导加载程序这是一个可引导映像。CRC 基本上是校验和(但不要问我它们是如何计算的);幸运的是,如果 image_type 设置为 10 ( 0x0a),它们将被忽略并且可以设置为 0。

据我所见,引导加载程序也忽略了映像版本和构建时间。它们只是为了工具或任何东西,以便更容易找出版本和东西。

“引导参数”,我不太确定。我看到“只需将其设置为 0”的内容——这显然有效。:) 但是如果它不是 0 意味着什么,我不能告诉你。

于 2012-03-02T17:56:16.820 回答