3.计算机上电 到 BIOS 再到 MBR的过程详解

本文结合博文–计算机是如何启动的?效果更佳。

0. 载入内存

首先明确一个概念:载入内存,包含两个部分:

  1. 程序被加载器(软件或硬件)加载到内存的某个区域。
  2. CPU 的 CS:IP 寄存器被指向这个程序的起始地址。

1. BIOS (Base Input & Output System)

为什么称为基本输入输出系统?
答:BIOS 只有 64KB 的空间,所以实现的功能是很少的,包括(检测一些基本的硬件,然后在内存中 0x000 ~ 0x3FF建立数据结构,中断向量表IVT并填写中断例程。)

上电后先进入实模式,在实模式下地址空间是 1MB的(20根地址线)。

先看一下实模式下的内存布局
在这里插入图片描述
这 1MB 的地址空间不全是对应于DRAM内存的,而是不同的存储设备
其中F0000 ~ FFFFF 对应的正是 BIOS,这部分对应的存储空间不是内存条,而是ROM。
000 ~ 9FFFF 的 640KB 的空间对应到DRAM,即内存条。

地址映射
在这里插入图片描述
过程

  1. 计算机一上电,CS:IP 寄存器被强制初始化为 0xF000:0xFFF0,所以从 ROM 中的 BIOS 开始执行指令。 (物理地址就是0xFFFF0,此处距离 1MB 的空间还有 16个字节,执行的是一个跳转指令)。
    如下图所示:
    物理地址0xFFFF0 中的指令是跳转指令 jmp f000:e05b。
  2. 跳转过去之后才真正执行 BIOS 的功能,包括基本硬件的检测与初始化,然后在内存中 0x000 ~ 0x3FF建立数据结构,中断向量表IVT并填写中断例程。
  3. BIOS 的最后一项工作是校验启动盘中位于 0 盘 0 道 1 扇区的内容。检查最后两个字节是否是魔数 0x55 和 0xaa。如果是,BIOS 认为存在可执行程序 MBR ,便把 MBR加载到物理地址 0x7c00 的位置。
  4. 最后通过指令 jmp 0:0x7c00实现跳转执行MBR的指令。
  5. 至此,BIOS 的任务就结束了,接下来就是 MBR 的任务了

综上所述,BIOS的入口地址是0xFFFF0,F0000 ~ FFFFF 是640KB的 BIOS。BIOS 存在ROM 里。
在这里插入图片描述

2. MBR(主引导记录)

主引导记录(MBR)是被加载到 0x7c00 来执行的,为什么是这么个奇葩地址,这是一个历史问题,当作魔数来理解好了,不深究。

MBR 才是咱们真正开始写的第一个代码,因为 BIOS 是厂商已经写好放在只读 ROM 里了。

MBR 的大小必须是 512 字节,且最后两个字节即 第510字节处和第511字节处必须是 0x55 和0xaa。只有这样 BIOS 才能知道这是 MBR。

现在可以编写字节的 MBR了。
根据博文编写主引导记录MBR来编写自己的 MBR。

所实现的 MBR 只是为了演示这一过程,而没有实用价值。
在以后的博文中将完善 MBR。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章