PCI扩展ROM头INIT功能的入口点



如第6.3.3.1节所示。ROM头扩展(PCI本地总线规范v2.3),偏移量0x3h是"INIT功能的入口点。POST对此位置执行FAR CALL。",此字段的长度为3字节。

我有一个长度为40448字节的PCI Rom映像,入口点字节为0xe9_cf_06(0xe9在地址0x3h,0xcf在地址0x4h,0x06在地址0x5h)。该偏移量超过ROM图像长度。有人可以帮助解释这个字段的含义,以及如何使用它来计算ROM上图像的入口点吗?

欢迎提出任何建议。谢谢

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

注意,你的ROM看起来像:

aa 55 xx e9 cf 06 ...

你不应该把这些字节记为0x_e9_cf_06——这是把多个字节解释为一个整数(你不是故意这么做的),因为这是英特尔,它的顺序不对(英特尔是小端序)。

你可以把这个ROM放进反编译器来了解更多。

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

我终于明白了这个字段的含义。它实际上是嵌入在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%xnn",entry);
        } else
                printf( "  Unable to determine entry point for INIT"
                        " function. Please report.nn");
        break;

相关内容

  • 没有找到相关文章

最新更新