【我所認知的BIOS】-->第一条指令
2019-04-13 20:48 发布
生成海报
【我所認知的 BIOS 】 --> 第一条指令
By LightSeed
2009-10-26
其实早就想写这样一篇文章了,今天才着手写了下。说来也惭愧关于 CPU 的第一条指令的问题,在一开始 study 的时候我自己并没有求甚解,所以当时理解的也比较肤浅,今天我们来详细探讨一下关于 reset (从没电到上电)后 CPU 执行第一条指令的一些东西。(说明一下:这篇文章是讨论的 IA32 架构上的处理器。)
1 、准备知识
如果您还对 Flat mode 的原理还不太了解的话,那么我想你可以再回头参考一下关于 Flat mode 的原理。见
http://blog.csdn.net/lightseed/archive/2009/07/01/4312834.aspx
在保护模式下,我们的段寄存器其实都是由两部分组成的:一步分是可见的段选择子( segment selector ),另外一部分是隐藏的基地址( base address )。那么第一条指令就和这个密切相关。
2 、 CPU 到哪里去取第一条指令
开门见山,当 HW reset 后, CPU 会到(物理地址为) 0FFFF FFF0H 处去取指令并执行之。这个地址很明显是 CPU 的最高物理地址往下数 16 个 bytes 的地址处。 BIOS 的第一条指令必须要被放到这里,否则的话。。。后果可想而知。
3 、为什么是这里
我想只要是刚入门的 freshman 都会感到比较疑惑,这个地址( FFFF FFF0H )明明是大于 1-Mbyte 的地址了,而此时的 CPU 却是在实模式下的,那么 CPU 是怎么到这里去取指令的呢?
3.1 原理
不过看完上面这段话的描述,我们是不是感觉有点亲切呢?再回忆一下,其实在我们之前的讨论中关于 Flat mode 的时候,就接触到个概念了。在 Flat mode 中的时候,虽然我们是处于实模式,但是由于我们的段寄存器( segment register )是由两个部分组成的,一部分是可见的段选择子,另外一部分是隐藏部分(段基地址)。如果我们在 protect mode 中修改好了段寄存器的段基地址部分,然后返回实模式,那么只要不显示地修改段寄存器, CPU 在寻址的时候仍然会照 protect mode 下的寻址方式来计算地址,即: segment selector : offset 。
3.2 BIST 后 CPU 的状态
经过正确的 power sequence 后, CPU 吃到 CPURST# 正常 BIST ( Built-In Self-Test )后, CPU 其实就正是处于 Flat mode 中。(比较特殊的实模式)那么让我们来看看正常的 BIST 后, CPU 的(部分)寄存器的状态吧。见图 1 。
图 1 BIST 后部分寄存器的值
图 2 CPU 关于 CR0 的 bit 定义
看清楚了图 2 中定义的 CR0 的 bit0 了么? PE ,是指 protect mode enable 。那么我们再结合图 1 两个方框处关于 CR0 和 CS 的初始值,可以很清楚地看到这个时候 CPU 是处于实模式的,然而 CS 的 Base 却是等于 FFFF0000H 的,而且段界限是 FFFFH ,并且 CS 的选择子是等于 F000H 的。
3.3 详细计算
那这样以来,如果我们用 CS:IP 是用 F000H:FFF0H 的方式来操作的时候, CPU 其实是会把地址这样算的。 F000H 是 CS 的段选择子,从这里取出 CS 的基地址(就是 FFFF0000H )再加上 IP 的值( FFF0H )就等于实际要访问的内存地址(正好是 FFFF FFF0H ) [FFFF0000+FFF0H=FFFFFFF0H] 。所以在 32bit 的 CPU 上,这个第一条指令的计算是这样来的。
不过一般情况下 HW reset 后, BIOS 都会在第一条指令这里安排一个 far jump 来显示地修改 CS 的值,目的就是能够让 CS 真正进入 real mode 。就是让 CS 能够遵从正常的 real mode 的寻址翻译规则。( CS base address = CS segment selector * 16 )。那至于后面的 BIOS code 的 run 的环境,我想大家就都应该了解了。
关于第一条指令的讲述 Bini 前辈也曾详细说明过,这里是连接供大家参考。
http://www.ufoit.com/bbs/thread-106-1-1.html
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮