1.机器加电时,内存控制器还没有初时化,内存是不可用。
2.机器加电时,对CPU的指令的解码不是北桥,CPU发出的地址被传递到南桥并由FHW(Firmware
Hub)解码到BIOS ROM芯片(Flash)。在加电时一直到引导进程初,BIOS的E段(0xE0000~0xEFFFF)和F
段(0xF0000~0xFFFFF)和4G内存顶端的对应段0xFFFE0000~0xFFFEFFFF和0xFFFF0000~0xFFFFFFFF都
被FWH解码到BIOS的ROM芯片的两个64区域。即在启动阶段访问0xE0000~0xEFFFF和
0xFFFE0000~0xFFFEFFFF是同一个BIOS区域,访问0xF0000~0xFFFFF和0xFFFF0000~0xFFFFFFFF是同
一个BIOS区域。
3.机器加电时,CS段寄存器值为0xF000,EIP值为0x0000FFF0,但CPU的取的地址是段寄存器不可见
的部分(影子寄存器)加上偏移部分,此时影子寄存器的值为0xFFFFFFF0。所以CPU执行的第一条指
令是0xFFFFFFF0(复位向量),通常在BIOS ROM对应的指令是一个跳转指令JMP F000:E05B,当取出跳
转完成后,由于CS段的影子寄存器刷新并重新加载,下一条指令地址是0xFE05B。不过这条指令仍
然从BIOS ROM里取得。
4.关于shadow BIOS,BIOS程序通常是压缩的,在系统初始化阶段,BIOS会解压BIOS Image到RAM中
,然后编程北桥控制器对0xE0000~0xFFFFF置为write only,这样对该区域的写被传递到DRAM里,
然后把解压的BIOS拷贝到E段和F段。最后重新编程北桥控制器对0xE0000~0xFFFFF置为read only。
对于PCI ROM BIOS,BIOS会把每个卡上的ROM拷贝到0xC0000~0xDFFFF然后执行他们的初时化代码。
5.BIOS ROM可以很大,但不都是可执行的,如含有ACPI Table等,开始解压到0xE0000~0xFFFFF只
是其中一部分,在启动过程中还需要从BIOS ROM解压代码到RAM中,并覆盖其中不需要的代码。这
个就好像BIOS ROM是硬盘(不过可用直接访问),真正执行的代码在RAM中一样。硬盘可以很大但RAM
小,这也就是程序的局部性原理。
首先一个概念要先区分一下,我认为这个是问题的关键。即,这里的4G末端是个映射,所指向的不是RAM,而是BIOS ROM,这时的BIOS根本没有被拷贝。
为什么这样说。有几点原因:1)此时MCH没有参与地址地址访问,而内存还未初始化,此时RAM不可用 2)从TOP_SWAP的讲述来看,此时ICH的A16被invert,所有访问0xFFFF0000 ~ 0xFFFFFFFF的访问变成对0xFFFE0000~0xFFFEFFFF的访问。我认为这里A16就是一个地址线引脚,所谓invert就是被拉低了。所以这时ICH在参与地址访问。3)还是老原因,实模式无法寻址到4G。
综上3个原因,我认为问题“JMP要跳转到的位置是在高地址(4G末端)Flash Rom BIOS中还是在低地址(1M末端)的shadow BIOS呢?”的实际解释是:0xF0000~0xFFFFF
和0xFFFF0000~0xFFFFFFFF都是指向BIOS ROM的两个映射而已,BIOS的拷贝只有一份,在BIOS
ROM里,这两个映射都指向它。所以无论跳转到哪儿,都是指向BIOS ROM,在跳转后CS被flush掉,这个时候使用低地址映射执行BIOS代码。
所以在这个过程中根本就没有RAM的参与,所谓4G末端只是个地址空间上的概念,BIOS也没有被拷贝。
阅读(4143) | 评论(0) | 转发(0) |