BIOS启动过程简述
作者 斯人 | 发布于 2014 年 1 月 23 日
BIOS LINUX 操作系统

CPU通电时,RAM是什么都没有的。计算机的操作系统只有先加载到RAM中才可以运行,那么是谁将操作系

统加载呢?答案是BIOS。但是又是谁去执行BIOS呢?答案是0xFFFF0,再加电的一瞬间,该系列所有的CPU

全部进入16bit的保护模式下运行,目的是保证兼容和解决最开始启动的问题。同时,CPU硬件逻辑设计为加

电瞬间强制将CS值设置为0Fx000,IP值设置为0xFFF0,这样CS:IP就指向0xFFFF0位置段。
这是一个纯硬件完成的过程,如果此时该位置无可执行代码,那么计算机就死机了。反之,计算机将从此处

开始执行代码,并沿着后续程序一直执行。而BIOS程序的入口恰恰就是0xFFFF0。
通电时,物理内存指向从0开始的连续内存,除了地址 0xA000 开始到0xFFFFF(640K-1M) 共384K和

0xFFFE0000到0xFFFFFFFF(4内存最后的64K)范围以外的内存都可以作为系统内存,这两个 范围 是用于I/O

设备和BIOS程序。

如图所示,cs 指向0xf000处,段基址 指向0xFFFF0000(段长度64K),也就是ROM BIOS 映射区,IP指向

0xFFF0,所以CPU最终指向的地址是
[段基址:IP]=0xFFFF0000+0xFFF0=0xFFFFFFF0
这个地址就是 4G空间最后一个64K地址,这些都是硬件决定的。
BIOS会跳到这个位置,从某一条指令开始执行进行 硬件检测和初始化操作,完成之后,bios还会把BIOS代码

和数据复制到内存低端1M末端的64K处,然后跳转到这个位置,CPU切换到实模式 工作,最后BIOS会从硬盘

或其他存储设备,把系统引导程序加载到0x7c00处,并跳转到这个地址继续执行。

0x07c0地址是Bios引导MBR到内存时的起始地址,这也是硬件决定的,所以你的操作系统或者引导程序必须假设汇编代码是从0x7c00地址开始的。如下图

此图说明了BIOS其他的内存区域使用情况。
到了这里BIOS 就要从硬盘或其他存储设备加载我们写的引导程序到内存0x07c0,并跳转到这个地址执行我们

的代码。
那BIOS又是怎么找到我们的启动程序呢?

BIOS在做完自检和初始化操作后,它将可启动设备的第一个扇区(512byte/扇区)读入内存绝对地址0x07c0

中,CPU跳转到这个地方继续执行。

下一篇将写一个bootloader实例来模拟BIOS的启动过程,能够加深认识。

原文出处:http://www.imsiren.com/archives/909