计算机系统的控制权(CPU的使用权)交接的第一棒是BIOS!接下来,我们简单学习一下BIOS相关知识。
在计算机接电后按下开机键,首先运行的软件是基本输入输出系统(Basic Input Output System,BIOS
)
于是就产生了非常经典的3个问题?
- BIOS是由谁加载的?
- BIOS被加载到哪里呢?
- 它的cs:ip是由谁更改滴?
为了更好的理解上面的3个问题,先简单了解一些实模式下的1MB内存布局。
实模式下的1MB内存布局
Intel 8086 有 20 条地址线,故其可以访问 1MB 的内存空间,即 20 次方=1048576 = 1MB。
地址范围用十六进制来表示,是 0x00000 到 0xFFFFF。这1MB的内存空间对其进行划分,如下表所示:
从低地址看,地址0~0x9FFFF (空间范围为640KB)处是 DRAM (Dynamic Random Access Memory ),即动态随机访问内存(动态的含义是需要不断刷新),我们所装的物理内存就是DRAM,如 DDR,DDR2等,也就是插在主板上的内存条。
看顶部的 0xF0000~0xFFFFF ,这 64KB 的内存是 ROM 。这里面存的就是 BIOS 的代码。 BIOS 的主要工作是检测、初始化硬件(硬件自己供了一些初始化的功能调用, BIOS 直接调用就可以完成初始化硬件的工作)。
【补充pro】
电脑安装了 4GB 内存,电脑中只显示 3.8GB 左右???
【说明】
上述问题可转化成在CPU眼中,我们插在主板上的物理内存不是它眼里“全部的内存”。
在计算机中,并不是只有咱们插在主板上的内存条需要通过地址总线访问,还有一些外设同样是需要通过地址总线来访问的,这类设备还很多呢。若把全部的地址总线都指向物理内存,那其他设备该如何访问呢?
因此,只好在地址总线上提前预留出来一些地址空间给这些外设用,这片连续的地址给显存,这片连续的地址给硬盘控制器等。留够了以后,地址总线上其余的可用地址再指向 DRAM,也就是指插在主板上的内存条。如下图所示。
✳✳✳回到最初的3个问题上~
- BIOS是由谁加载的?
BIOS是由硬件加载的。这个硬件相当于只读存储器(Read-Only Memory,ROM),只读存储器内容是不可擦除。BIOS被写入此ROM。由于ROM是内存,内存就会被访问,此ROM 被映射在低端1MB 内存的顶部,即地址0xF0000~0xFFFFF 处。因此只要访问此处的地址便是访问了 BIOS ,这个映射是由硬件完成的。
- BIOS被加载到哪里呢?
由上面的说明可知,BIOS被加载到0xF0000~0xFFFFF 处。BIOS 本身是个程序,程序要执行,就要有个入口地址才行,此入口地址便是0xFFFF0。
- 它的cs:ip是由谁更改滴?
在开机的 瞬间,也就是接电的一瞬间, CPU cs: ip 寄存器被强制初始化为 0xF000 : 0xFFF0。由于开机的时候处于实模式,在实模式下的段基址要乘以 16 ,也就是左移 4 位,于是 0xF000 : 0xFFF0的等效地址将是0xFFFF0 。0xFFFF0 地址便是 BIOS 的入口地址。
参考资料
- 《操作系统真象还原》