0

如第 6.3.3.1 节所述。ROM Header Extensions (PCI Local Bus Specification v2.3),偏移量 0x3h 是“INIT 函数的入口点。POST 对此位置进行 FAR CALL。”,该字段的长度为 3 个字节。

我有一个长度为 40448 字节的 PCI Rom 映像,入口点字节为 0xe9_cf_06(地址 0x3h 处的 0xe9,地址 0x4h 处的 0xcf 和地址 0x5h 处的 0x06)。此偏移量超过 ROM 映像长度。谁能帮忙解释一下这个字段的含义以及如何使用它来找出ROM上图像的入口点?

任何建议表示赞赏。谢谢!

4

2 回答 2

1

偏移03h 量是入口点,而不是入口点的地址。这意味着 BIOS 实际上会跳转到 offset03h并开始在那里执行代码。

请注意,您的 ROM 看起来像:

aa 55 xx e9 cf 06 ...

您不应该将这些字节标记为0x_e9_cf_06- 将多个字节解释为整数,(您不是故意这样做的),并且由于这是 Intel,它的顺序错误(Intel 是little endian)。

您可以将此 ROM 放入反编译器以了解更多信息。

正如您所发现的,E9 CF 06是一个JMP 0x06CF意思(从下一条指令跳转 0x6CF 字节)。永远记得查阅英特尔指令集参考(第 2 卷)

于 2013-08-28T08:52:33.320 回答
0

我终于弄清楚了这个字段的含义。它实际上是嵌入在 ROM 标头中的 x86 指令。第一个字节“0xe9”是跳转指令。有兴趣的可以查看fcode套件源码了解更多详情

        switch (data->reserved[1]) {
        case 0xeb: /* short jump */
                entry = data->reserved[2] + 2;
                /* a short jump instruction is 2 bytes,
                 * we have to add those to the offset
                 */
                break;
        case 0xe9: /* jump */
                entry = ((data->reserved[3]<<8)|data->reserved[2]) + 3;
                /* jump is 3 bytes, so add them */
                break;
        default:
                entry=0;
                break;
        }

        if (entry) {
                /* 0x55aa rom signature plus 1 byte len */
                entry += 3;
                printf( "  Entry point for INIT function:"
                        " 0x%x\n\n",entry);
        } else
                printf( "  Unable to determine entry point for INIT"
                        " function. Please report.\n\n");

        break;
于 2013-08-28T06:46:12.417 回答