BIOS
工作原理
最近几天在看《
UNIX
操作系统设计》突然想到计算机是如何启动的呢?那就得从
BIOS
说起,其实这个冬冬早已是
n
多人写过的了,今天就以自己的理解来写写,权当一个学习笔记。
一、
预备知识:
很多人将
BIOS
与
CMOS
混为一谈,在开始介绍
BIOS
工作原理以前先来简单的了解以下
BIOS
、
CMOS
:
什么是
BIOS
系统开机启动
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
、网络服务器等有效的启动驱动器
,读入操作系统引导记录,然后将系统控制权交给引导记录,由引导记录完成系统的启动。
什么是
CMOS
CMOS
(本意是指互补金属氧化物半导体
——
一种大规模应用于集成电路芯片制造的原料)是微机主板上的一块可读写的
RAM
芯片,用来保存当前系统的硬件配置和用户对某些参数的设定。
CMOS
可由主板的电池供电,即使系统掉电,信息也不会丢失。
CMOS RAM
本身只是一块存储器,只有数据保存功能,而对
CMOS
中各项参数的设定要通过专门的程序。早期的
CMOS
设置程序驻留在软盘上的
(
如
IBM
的
PC/AT
机型
)
,使用很不方便。现在多数厂家将
CMOS
设置程序做到了
BIOS
芯片中,在开机时通过特定的按键
就可进入
CMOS
设置程序方便地对系统进行设置,因此
CMOS
设置又被叫做
BIOS
设置。
早期的
CMOS
是一块单独的芯片
MC146818A(DIP
封装
)
,共有
64
个字节存放系统信息
,
见
CMOS
配置数据表。
386
以后的微机一般将
MC146818A
芯片集成到其它的
IC
芯片中
(
如
82C
206
,
PQFP
封装
)
,最新的一些
586
主板上更是将
CMOS
与系统实时时钟和后备电池集成到一块叫做
DALLDA DS1287
的芯片中。随着微机的发展、可设置参数的增多,现在的
CMOS RAM
一般都有
128
字节及至
256
字节的容量。为保持兼容性,各
BIOS
厂商都将自己的
BIOS
中关于
CMOS RAM
的前
64
字节内容的设置统一与
MC146818A
的
CMOS RAM
格式一致,而在扩展出来的部分加入自己的特殊设置,所以不同厂家的
BIOS
芯片一般不能互换,即使是能互换的,互换后也要对
CMOS
信息重新设置以确保系统正常运行。
二、工作原理介绍
下面从计算机加电开始,看
BIOS
是如何一步一步工作的:
1、
加电
计算机电源开始工作,当电源的输入电压稳定以后,主板的
timer
被触发,它产生一个复位脉冲送给
80X86cpu
让
cpu
开始工作,当
cpu
收到该复位脉冲后,其硬件逻辑就会置
CS
寄存器为
FFFFH
,
IP
寄存器为
0000H
,也就是说,会自动地到
FFFF:0000H
去取第一条指令,(在对内存编址的时候,高地址部分总是编给一些
ROM
,在这些
ROM
里是预先写好的程序或数据,地址
FFFF
:
0000h
其实就是在
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
进行下一步启动工作