天涯共此良辰时

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

一、前置知识:

  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地址一直沿用至今...

posted on 2022-04-19 15:50  天涯共此良辰时  阅读(706)  评论(0编辑  收藏  举报