转载于:http://blog.youkuaiyun.com/maomaovv/article/details/1549819
最近几天在看《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芯片中(如82C206,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:7C00h开始的地方。如果软盘中没有DOS引导盘,则BIOS搜索硬盘寻找硬盘的第一个扇区,然后把主引导记录(MBR)载入内存0000:7C00h开始的地方。一旦引导记录加载完毕,BIOS就交出系统的执行控制权,跳转到引导程序的头部执行。下面就是硬盘的MBR代码流程,其中的引导扇区是指硬盘相应分区的第一个扇区,是和操作系统有关的操作系统的引导是由它来完成的,而MBR(硬盘的第一个扇区)并不负责,MBR和操作系统无关他的任务是把控制权转交给操作系统的引导程序 。
程序流程:
1 将程序代码由0000:7C00H移动到0000:0600H(注,BIOS把MBR放在0000:7C00H处)
2 搜索可引导分区,即80H标志
成功:goto 3
失败:跳入ROM BASIC
无效分区表:goto 5
3 读引导扇区 (注:用于操作系统的引导,将它读到0000:7C00H)
失败:goto 5
成功:goto 4
4 验证引导扇区最后是否为55AAH
失败:goto 5
成功:goto 6
5 打印错误进入无穷循环
6 跳到0:7C00H进行下一步启动工作