Linux PC 开机全过程

1.2 硬件初始化

硬件复位

硬件复位后执行的第一条指令,是位于物理地址FFFFFFF0H的指令。这个地址位于处理器的物理地址最高位下方16字节处。装载有软件初始化代码的EPROM必须位于此处。
当处理器位于实地址模式时,物理地址FFFFFFF0H已经超出1MB可寻址范围。处理器按照下面所述方式才能初始化到这个地址。CS寄存器有2个部分:可见段选择器部分和不可见基地址部分。在实模式下,基址通常是把16-bit的段选择器向左shift操作4个bit来产生一个20-bit的基地址。但是,在硬件复位的过程中,位于CS寄存器中的段选择器会被加载为F000H,而基地址会加载为FFFF0000H。这样启动地址就可以通过把基地址和EIP寄存器中的值相加来获得(也就是FFFF0000 + FFF0H = FFFFFFF0H)。
在硬件复位之后,一旦CS寄存器被加载一个新的值,处理器就会遵循实模式下正常的地址转换规则(也就是[CS基地址=CS段选择器 * 16])。为了确保CS寄存器中的基地址始终保持不变直到基于EPROM的软件初始化代码完成,软件初始化代码绝对不能包含远距离的跳转、调用或者允许产生中断(中断也会导致CS选择器的值发生改变)。

简单总结
实模式只有1MB寻址空间,这个是常识了。FFFFFFF0H只比32位处理器可寻址的4GB空间低16个字节,远远越界,无法在实模式寻址。
为了解决这个问题CPU只好“作弊”。它直接把FFFF0000HFFF0H存储在对应的寄存器中,暴力相加就能得到启动地址,并且进入一种特殊的寻址模式,直到CS寄存器被赋予新值。
一旦CS寄存器被赋予新值,FFFFFFF0H处的代码就无法访问了,因此CPU从启动地址FFFFFFF0H开始执行EPROM的代码后,还得保护CS寄存器中的基地址不变,防止CPU按照正常方式寻址,所以不可以有造成基地址变动的大动作,不然基地址丢了你就没法继续寻址了。
EPROM的代码,通俗来说指的就是BIOS了。具体区别今后再谈。

实际验证