- 论坛徽章:
- 0
|
我看过一些资料,可能是错误的,仅供参考,切勿笑话。
1,386以后的cpu没有什么真正的实模式,执行第一条指令时,也就是"jmp far f000:e05b"的时候就是所谓32位的分段机制(就是用GDT,IDT来分段的那个什么来着),32位CPU在实模式下的分段机制其实就是加了一些限制的32位分段机制,很明显,执行第一条指令的时候A20是开启的。这个问题说起来话长,这里就不多说了,就此打住。我的观点是这个跳转是跳到1M以下的那个BIOS,在bochs里面就可以看到,第一条指令的地址是0xFFFFFFFF0,而第二条则位于0x000FE0FD.
2,据我了解,应该是拷贝的, 在bochs源代码中,有一个BIOS的实现,包括rombios.c,rombois32.c等文件,大致流程是,先切换到32位模式,然后把flash rom中的bios拷贝到一个临时区域,再告诉北桥芯片组将原先分配给flash BIOS的地址重新分配给DRAM bios.关于这一点,我们可以在rombios32.c的源代码中看到:
static int find_bios_table_area(void)
{
unsigned long addr;
for(addr = 0xf0000; addr < 0x100000; addr += 16) {
if (*(uint32_t *)addr == 0xaafb4442) {
bios_table_cur_addr = addr + 8;
bios_table_end_addr = bios_table_cur_addr + *(uint32_t *)(addr + 4);
BX_INFO("bios_table_addr: 0x%08lx end=0x%08lx\n",
bios_table_cur_addr, bios_table_end_addr);
return 0;
}
}
return -1;
}
static void bios_shadow_init(PCIDevice *d)
{
int v;
if (find_bios_table_area() < 0)
return;
/* remap the BIOS to shadow RAM an keep it read/write while we
are writing tables */
memcpy((void *)BIOS_TMP_STORAGE, (void *)0x000f0000, 0x10000); //将BIOS拷贝到临时区域
v = pci_config_readb(d, 0x59);
v = (v & 0x0f) | (0x30);
pci_config_writeb(d, 0x59, v); //这里估计就是所谓的重新映射
memcpy((void *)0x000f0000, (void *)BIOS_TMP_STORAGE, 0x10000); //从临时区域拷贝到刚映射的DRAM中。
i440_pcidev = *d;
} |
|