1.1.2 BIOS在内存中加载中断向量表和中断服务程序
BIOS程序的代码量并不大,却非常精深,需要对计算机的整个硬件体系结构非常熟悉才能将其看明白。要想把BIOS是如何运行的讲清楚,也得写很厚一本书,这显然超出了本书的主题和范围。我们的主题是操作系统,所以只会将与启动操作系统有直接关系的内容讲解一下。
BIOS程序被固化在计算机主机板上的一块很小的ROM芯片里。通常,不同的主机板所用的BIOS也有所不同,就启动部分而言,各种类型的BIOS的基本原理大致相似。为了便于大家理解,我们选用的BIOS程序只有8KB,所占地址段为0xFE000~0xFFFFF,如图1-1所示。现在CS:IP已经指向了0xFFFF0这个位置,这意味着BIOS开始启动了。随着BIOS程序的执行,屏幕上会显示显卡的信息、内存的信息……说明BIOS程序在检测显卡、内存……这期间,有一项对启动(boot)操作系统至关重要的工作,那就是BIOS在内存中建立中断向量表和中断服务程序。
小贴士
ROM(Read Only Memory):只读存储器,现在通常用闪存芯片做ROM。虽然闪存芯片在特定的条件下是可写的,但在谈到主机板上存储BIOS的闪存芯片时,业内人士把它看作ROM。ROM有一个特性,就是断电之后仍能保存信息,这一点与硬盘类似。
BIOS程序在内存最开始的位置(即:0x00000)用1KB的内存空间(0x00000~ 0x003FF)构建中断向量表,并在紧挨着它的位置用256字节的内存空间构建BIOS数据区(0x00400~0x004FF),在大约56KB以后的位置(0x0E05B)加载了8KB左右的与中断向量表相应的若干中断服务程序,图1-2中精确地标注了这些位置。
小贴士
一个容易计算的方法:0x00100是256个字节,0x00400就是4×256字节=1024字节,即1KB。因为是从0x00000开始计算,所以1KB的高地址端不是0x00400,而是0x00400-1,也就是0x003FF。
![]() |
图1-2 BIOS在内存中加载中断向量表和中断服务程序 |
中断向量表中有256个中断向量,每个中断向量占4个字节,其中两个字节是CS的值,两个字节是IP的值,每个中断向量都指向一个具体的中断服务程序。
下面将详细讲解后续程序是如何利用这些中断服务程序把系统内核程序从软盘加载至内存的。
小贴士
中断 INT(INTerrupt):顾名思义中断就是中途打断一件正在进行中的事。其最初的意思是:外在的事件打断正在执行的程序,转而执行处理这个事件的特定程序,处理结束后,回到被打断的程序继续执行。现在,可以先将中断理解为一种技术手段,在这一点上与C语言的函数调用有些类似。
中断对操作系统来说意义重大,后面我们还会深入讨论。