一、 预备知识:

系统开机启动 BIOS ,即微机的基本输入输出系统 (Basic Input-Output System) ,是集成在主板上的一个 ROM 芯片,其中保存有微机系统最重要的基本输入 / 输出程序、系统信息设置、开机上电自检程序和系统启动自举程序。
集成在 BIOS 上得程序主要有如下几个:

  • BIOS 中断例程: 即 BIOS 中断服务程序。它是微机系统软、硬件之间的一个可编程接口,用于程序软件功能与微机硬件实现的衍接。 DOS/Windows 操作系统对软、硬盘、光驱与键盘、显示器等外围设备的管理即建立在系统 BIOS 的基础上。程序员也可以通过 对 INT 5 、 INT 13 等中断的访问直接调用 BIOS 中断例程。
  • BIOS 系统设置程序: 微机部件配置情况是放在一块可读写的 CMOS RAM 芯片中的,它保存着系统 CPU 、软硬盘驱动器、显示器、键盘等部件的信息。 关机后,系统通过一块后备电池向 CMOS 供电以保持其中的信息。如果 CMOS 中关于微机的配置信息不正确,会导致系统性能降低、零部件不能识别,并由此引发一系统的软硬件故障。在 BIOS ROM 芯片中装有一个程序称为 “ 系统设置程序 ” ,就是用来设置CMOS RAM 中的参数的。这个程序一般在开机时按下一个或一组键即可进入(一般为 Delete 键),它提供了良好的界面供用户使用。这个设置 CMOS 参数的过程,习惯上也称为 “BIOS 设置 ” 。新购的微机或新增了部件的系统,都需进行 BIOS 设置。
  • POST 上电自检 微机接通电源后,系统将有一个对内部各个设备进行检查的过程,这是由一个通常称之为 POST(Power On Self Test, 上电自检 ) 的程序来完成的。这也是 BIOS 的一个功能。完整的 POST 自检将包括 CPU 、 640K 基本内存、 1M 以上的扩展内存、 ROM 、主板、 CMOS 存贮器、串并口、显示卡、软硬盘子系统及键盘测试。自检中若发现问题,系统将给出提示信息或鸣笛警告。
  • BIOS 系统启动自举程序 在完成 POST 自检后, ROM BIOS 将按照系统 CMOS设置中的启动顺序搜寻软硬盘驱动器及 CDROM 、网络服务器等有效的启动驱动器,读入操作系统引导记录,然后将系统控制权交给引导记录,由引导记录完成系统的启动。

二、工作原理介绍

下面从计算机加电开始,看 BIOS 是如何一步一步工作的:

1、 加电
计算机电源开始工作,当电源的输入电压稳定以后,主板的 timer 被触发,它产生一个复位脉冲送给 80X86cpu 让 cpu 开始工作,当 cpu 收到该复位脉冲后,其硬件逻辑就会置 CS 寄存器为 FFFFH , IP 寄存器为 0000H ,也就是说,会自动地到FFFF:0000H 去取第一条指令,(在对内存编址的时候,高地址部分总是编给一些ROM ,在这些 ROM 里是预先写好的程序或数据,地址 FFFF : 0000h 其实就是写死在 ROM 里的了,就这么简单。) 这个地方只有一条JMP 指令,告诉处理器到什么地方读取 BIOS ROM 。

2 、 POST
POST 其实是一系列的执行不同初始化和计算机硬件检测的函数或例程。 BIOS以对主板硬件的一系列检测开始,包括检测: cpu ,数学协处理器、时钟 IC , DMA控制器和中断请求( IRQ )控制器,检测的顺序根据主板的不同而不同。
然后, BIOS 会在地址 C000:000h 和 C780:000h 之间检测视频 ROM 是否存在,如果视频 BIOS 存在,则对视频 ROM 中的内容求校验和进行检测,如果检测成功,则BIOS 将控制权转交给视频 BIOS 让其初始化当完成时再将控制权交回给 BIOS 。此时你将会在屏幕上看到显卡信息,例如显卡制造商的 logo ,显卡的描述信息,以及显卡BIOS 信息等。
然后 BIOS 以 2K 的增量扫描 C800:000h 到 DF800:000h 直接的地址,以检测计算机中可能装的其他 ROM ,比如网卡、 SCSI 适配器等,如果找到一个设备的 ROM ,则对该设备的 ROM 中的内容做校验和,如果检测通过则将控制权转交给设备 BIOS让其对设备进行初始化,初始化结束后 BIOS 再收回控制权,如果校验和检测失败,将再屏幕上显示:“ XXX ROM Error ”,其中 XXX 是检测到该 ROM 的地址的断地址。
然后, BIOS 开始检测地址为 0000:0472h 的内存,该处存放这一个标识系统是通过冷启动启动还是通过热启动启动的标志,如果为 1234h 则代表热启动(该数值是一little endian 的格式存储的,因此在内存中的应为 3412 ), BIOS 将直接跳过剩余的POST 例程。如果是冷启动, BIOS 将继续执行剩余的 POST 例程,在此过程中,BIOS 将一个 16 进制的编码写到端口 80h (不同的计算机端口号会不同),这个 16 进制编码指示在何时检测什么。

3 、引导操作系统
POST 结束之后, BIOS 会寻找一个操作系统。通常, BIOS 会试图在软驱中寻找DOS 系统的引导盘,如果找不到,它会试图在 C 盘寻找操作系统。如果软驱中有引导盘, BIOS 将 1 扇区 0 磁头 0 柱面的内容(引导记录)载入内存 0000 : 7C 00h 开始的地方。如果软盘中没有 DOS 引导盘,则 BIOS 搜索硬盘寻找硬盘的第一个扇区,然后把主引导记录( MBR )载入内存 0000 : 7C 00h 开始的地方。 一旦引导记录加载完毕, BIOS 就交出系统的执行控制权,跳转到引导程序的头部执行。下面就是硬盘的 MBR 代码流程,其中的引导扇区是指硬盘相应分区的第一个扇区,是和操作系统有关的操作系统的引导是由它来完成的,而 MBR (硬盘的第一个扇区)并不负责,MBR 和操作系统无关他的任务是把控制权转交给操作系统的引导程序 。
程序流程:
1 将程序代码由 0000:7C00H 移动到 0000:0600H (注, BIOS 把 MBR 放在0000:7C00H 处)
2 搜索可引导分区,即 80H 标志
成功: goto 3
失败:跳入 ROM BASIC
无效分区表: goto 5
3 读引导扇区 ( 注:用于操作系统的引导,将它读到 0000 : 7C 00H)
失败: goto 5
成功: goto 4
4 验证引导扇区最后是否为 55AAH
失败: goto 5
成功: goto 6
5 打印错误进入无穷循环
6 跳到 0:7C00H 进行下一步启动工作