发信人: wenbobo()
整理人: wenbobo(2002-12-31 10:50:37), 站内信件
|
BIOS扮演的最重要的角色之一就是启动系统。当PC被打开时,它的系统内存中是空的,它需要马上找到一条代码以启动机器。这些代码就在BIOS中,因为BIOS被放置在ROM中,所以即使系统内存的其它部分是空的,但BIOS中的程序却总是可以使用的。
我们来看一看在Power-on之后的“硬件”Booting阶段,系统到底都做了些什么。同时,也看一看通过硬盘启动OS和软盘启动OS之间究竟存在着哪些不同。
第一推动力:CPU的第一条指令
CPU从物理地址FFFFFFF0h取出并执行硬件Reset之后的第一条指令。这个地址到最大物理地址4 GB之间只有16 Bytes的空间,包含软件初始化代码的EPROM必须被影射到这个地址。在Real Mode下,地址FFFFFFF0h超过了1 MB的物理地址范围。CS寄存器被分为两部分:可见的“Segment Selector”部分和隐藏的"Base Address"部分。
在Real Address Mode下,"Base Address"部分的值,等于将16-bit的"Segment Selector"左移4-bit所形成的20-bit地址,"Segment Selector"部分并不参与物理地址的计算,在Real Mode下,它仅仅被用来计算"Base Address"部分。而"Base Address"部分被真正的用于实际物理地址的计算。
在硬件Reset期间,CS中的"Segment Selector"部分被初始化为F000h,而"Base Address"部分被初始化为FFFF0000h,这与上述的原则不相符,但没有关系,因为"Base Address"已经有一个值了。所以,第一条指令的地址为Base Address + EIP = FFFF0000h + FFF0h = FFFFFFF0。
EPROM中放置着PC厂商所编写的代码(BIOS),被影射在地址FFFFFFF0h的代码必须为一条"far jump"或者"far call"指令或者产生一个中断,这样CS的"Segment Selector"的值将会被改变,从而"Base Address"部分的值也按照上述计算原则被改变为BIOS代码的影射地址。
从此以后,王子和公主过着幸福的生活……错了,是BIOS Boot Sequence代码开始被执行*_^。
后面的,请参考楼下的INT 19H资料。
---- 掬水月在手
弄花香满身 |
|