参考:https://zhuanlan.zhihu.com/p/113536449
1 实模式下的内存分布
实模式下,内存可用范围是0到0xFFFFF(2^20字节,1MB内存空间)。
我们可以看到,内存被各种外设瓜分了。
2 主板做的工作
电源按钮连接着主板上的复位线,主板上的复位线连接着CPU的RESET引脚。当按电源按钮的瞬间,主板电路会检测交流电是否是在要求范围内,等电源稳定下来,主板电路产生"Power Good"信号。
产生Power Good信号之后,主板电路做两件事:
1 通过主板电路的控制,产生RESET信号传送到CPU的RESET引脚。CPU启动内部初始化程序,CPU初始化完成后进入实地址模式。主板CPU的PC寄存器被初始化为0xFFFF0。
2 主板电路将ROM中的BIOS加载到内存的0xF0000~0xFFFFF。
以上两步完成之后,CPU已经初始化完毕,开始它的正常表演了。CPU将按照PC寄存器中的地址,在时钟周期的控制下,取指令,执行指令。在上面第1步,我们知道PC寄存器被初始化为0xFFFF0,所以CPU按照它的节奏,执行0xFFFF0处的指令。由上面第2步我们知道BIOS程序已经加载到0xF0000~0xFFFFF,其中0xFFFF0处存放的指令是
jmp far f000:e05b
是一条跳转指令,跳转到0xfe05b 处开始执行。这个地址还是处于0xF0000~0xFFFFF范围内,还是映射到内存的BIOS指令。
0xfe05b处主要做如下动作
1 POST(Power On Self Test)
2 BIOS程序初始化中断向量表0x00000~0x003ff(1KB)等其他一些内存区间初始化。
3 按BIOS设置好的顺序逐一尝试加载启动媒体(硬盘,光驱,软驱,USB盘)的启动程序。如果末尾的两个字节分别是 0x55 和 0xaa,那么 BIOS 就会认为它是个启动区。对于我们常用的硬盘,则把0面,0道,1扇区的内容(512字节),也就是我们说的MBR加载到0x7C00单元开始的区域。(指令集中有专门读取硬盘的指令in和out)。
4 引导扇区的512字节被加载到0x7C00之后,接下来是一条跳转指令。PC寄存器将被赋值为0x7C00,也就是说,接下来会执行0x7C00处的指令。
至此,BIOS完成了它的使命,接下来是引导扇区中指令的执行。
从引导扇区程序执行开始操作系统内核的执行。