“硬件复位后,处理器中CS寄存器中可见的段选择符部分的值为F000H,EIP的值为0000FFF0H,由于处理器运行于实模式,并不使用CS中隐含的描述符部分,故处理器执行的第一条指令的地址遵循实模式下的物理地址生成规则而得:CS*16+EIP,即FFFF0000H+FFF0H=FFFFFFF0H。所以,硬件复位后,处理器从物理地址为FFFFFFF0H的存储单元取指执行。因此,要求含有初始化代码(一般就是所谓的BIOS)的EPROM必须映射到该地址。”
很疑惑怎么从F000H变换到了FFFF0000H
解答:
可以说是硬规定的。因为开机后进入的是实模式,所以才是所谓的CS*16+EIP。但CPU内部电路给CS段的高12位A31~A20一直保持高电平,也就是1;所以F000H*16=F0000H,F0000H+0000FFF0H=000FFFF0H,高12位为高电瓶 所以是FFFF0000H。其实主要是怕开机后指令跳到别的地方去,硬加的高电瓶
注意:对于Intel 386及以上CPU,实模式下的内存寻址
Rom BIOS启动详解
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(Memory Controller Hub,内存控制器中心)没有参与地址地址访问,而内存还未初始化,此时RAM不可用 2)从TOP_SWAP的讲述来看,此时ICH(I/O Control Hub)的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也没有被拷贝。
很疑惑怎么从F000H变换到了FFFF0000H
解答:
可以说是硬规定的。因为开机后进入的是实模式,所以才是所谓的CS*16+EIP。但CPU内部电路给CS段的高12位A31~A20一直保持高电平,也就是1;所以F000H*16=F0000H,F0000H+0000FFF0H=000FFFF0H,高12位为高电瓶 所以是FFFF0000H。其实主要是怕开机后指令跳到别的地方去,硬加的高电瓶
注意:对于Intel 386及以上CPU,实模式下的内存寻址
Rom BIOS启动详解
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(Memory Controller Hub,内存控制器中心)没有参与地址地址访问,而内存还未初始化,此时RAM不可用 2)从TOP_SWAP的讲述来看,此时ICH(I/O Control Hub)的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也没有被拷贝。