如第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 06
是JMP 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;