如第6.3.3.1节所述。 ROM标头扩展(PCI本地总线规范v2.3),偏移量0x3h是“INIT功能的入口点.POST对该位置进行远程调用。”,该字段的长度为3个字节。
我有一个PCI Rom图像,长度为40448字节,入口点字节为0xe9_cf_06(地址0x3h为0xe9,地址为0x4h为0xcf,地址为0x5h为0x06)。该偏移超过ROM图像长度。请问有谁可以帮忙解释一下这个字段的含义以及如何使用它来弄清楚ROM上图像的入口点?
任何建议都表示赞赏。谢谢!
答案 0 :(得分:1)
Offset 03h
是入口点,而不是入口点的地址。这意味着BIOS实际上跳转到偏移03h
并开始在那里执行代码。
注意,您的ROM看起来像:
aa 55 xx e9 cf 06 ...
你不应该将这些字节标记为0x_e9_cf_06
- 这将多个字节解释为整数(你不应该这样做),因为这是英特尔,它的顺序是错误的(英特尔)是little endian)。
您可以将此ROM放入反编译器中以了解更多信息。
正如您所知,E9 CF 06
是JMP 0x06CF
,这意味着(从 next 指令跳转0x6CF字节)。请务必参考Intel Instruction Set Reference (Vol. 2)。
答案 1 :(得分: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;