一、前置知识:
1)硬件中断处理
BIOS的服务功能是通过调用中断服务程序来实现的,根据服务类型不同分为很多组,每组都有专门的中断号。比如显示服务,中断号为10H;屏幕打印,中断号为05H;串口服务,中断号为14H等等。每组又可根据功能细分为不同的服务号,比如显示服务(INT 10H),当功能为00H(AH=00H)表示设置显示器模式,当功能为01H(AH=01H)表示设置光标形状等等。
INT 13H主要用于对硬件磁盘进行操作。
INT 19H主要用于将MBR加载到内存0x7c00。
2)程序计数器
存放下一条指令所在单元的地址
3)硬件标识
硬件以地址的形式存储在内存RAM中
二、BIOS工作原理
第一阶段:开机加电阶段
按下开机按钮的时候,电源向计算机主板以及其它硬件设备供电。刚开始电压不稳定,计算机主控芯片会不断的向CPU发送RESET信号,试图让CPU自动恢复初始状态,当主控芯片检测到稳定电压后:1)撤销RESET信号的发送;2)程序计数器初始化为FFFF:0H。CPU开始执行该处(FFFF:0H)指令(jmp start)
第二阶段:POST(Power-on Self Test)阶段,即开机自检阶段
系统BIOS启动后,进行一些列硬件检测与初始化操作:显卡、CPU、内存以及标准硬件设备。
第三阶段:其它设备的检测与更新,以及CPU控制权转交
BIOS通过INT 19H中断程序将启动盘第一扇区MBR加载到RAM(0x00007C00),同时CPU程序计数器设置为0x00007C00H,开始执行MBR。
答疑:为何BIOS将MBR读入0x7C00地址处?0x7C00这个地址来自Inter的第一代个人电脑芯片8088,以后的CPU考虑到兼容性,一直保留使用这个地址。
1981年8月,IBM公司生产了世界上第一台个人电脑PC5150,至此它就是现代x86个人电脑兼容机的祖先,其中0x7c00就出现在这个电脑的ROM BIOS的INT 19H中断处理程序中。个人计算机肯定要运行操作系统,在这台计算机上,运行的操作系统是DOS 1.0,此系统要求的最小内存为32K,所以此版本BIOS也是按照最小内存32KB研发的。
在操作系统被加载后,内存布局如下:
+---------------------------------------0x0
| Interrupts vectors(中断向量表)
+---------------------------------------0x400
| BIOS data area(BIOS的数据区域)
+---------------------------------------0x5??
| OS load area(操作系统加载区域)
+---------------------------------------0x7C00
| Boot sector(引导区域)
+---------------------------------------0x7E00
| Boot data/stack(引导数据/堆栈)
+---------------------------------------0x7FFF
| (not used)
+---------------------------------------(....)
当时,搭配的操作系统是86-DOS,这个操作系统需要的内存最少是32KB,内存地址从0x0000开始编号,32KB的内存就是0x0000~0x7FFF,其中8086芯片本身需要占用0x0000~0x03FF,用来保存各种终端处理程序的存储地址,比如主引导记录本身就是中断信号INT 19H的处理程序,因此仅剩下0x0400~0x7FFF地址空间可以使用。
为了把尽量多的连续内存留给操作系统,主引导记录就被放到了内存地址的尾部。由于一个扇区是512字节,主引导记录本身也会产生数据,需要另外留出512字节保存,所以,它的预留位置变成了
0x7FFF - 512 - 512 + 1 = 0x7C00
最终0x7C00地址一直沿用至今...