众所周知,计算机启动时首先启动的软件是BISO,你有没有想过以下三个问题?
1.bios谁加载了程序? 2.它被加载到哪里? 3.它的cs:ip谁来修改?
Intel 8086有20条地址线,因此,它可以访问的内存长度为20次=1048576=1MB。如果按照16进制表示范围为0x00000到0xFFFFF。而这1MB空间分为几个空间。大致如下图所示:
首先,乍一看,我们可能会觉得很复杂。事实上,我们很容易理解它的分类。在谈论这张表之前,我们先回答第一个问题。
计算机硬件结构中有一种存储结构ROM(只读存储器)用于存储一尘不变的数据。一旦数据写入,就不会修改了。当然,现在有很多bios支持升级,估计至少以前几乎不会修改,除非主板坏了,需要刷bios哈哈哈。ok,了解了bios在硬件特性之后,让我们来看看它在实际内存中的地址。biso低端1通常被映射MB内存的顶部,即0xF0000 ~ 0xFFFFF,从上图可以看出,这个空间包含了bios系统本体和16条B跳转指令的大小。
ok,看完内存结构,我们来谈谈。bios硬件层实际启动过程。
在通电开机的那一刻,cpu的cs:ip硬件强制将寄存器初始化为0xF000:0XFFF0.初始化完成后,cpu开始计算和跳转cs第一条指令执行寄存器保存的真实物理地址。
(实模式下真实物理地址 =段基址 * 16 偏移地址)
cs:ip寄存器段基址为0xF偏移地址为0000xFFF0。将0XF000换算为10进制为61440xFFF10转换为65520.所以真实的物理地址 = 61440 * 16 65520 = 1048560即16进制的。定睛一看,我滴妈!这段16B空间包含跳转指令。好家伙计算一下F000:E05B 物理起始地址
61440*16 57435 = 1040475 => 0xFE05B
所以bios真正的指令执行地址是,正好处于 0xF0000~0xFFFEF这段bios本体内存。
接下来bios当检测通过并初始化硬件时,开始不断检测内存、图形卡等外设信息。x000 ~ 0x3FF出建立中断向量表,并写入中断例程。上图可以看到内存范围。到目前为止,bios完成的了所有工作,随后它将把任务转交出去,谁?接下来我们再聊。