【我所認知的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

【我所認知的BIOS】--第一条指令相关推荐

  1. 【我所認知的BIOS】—SMM (SYSTEM MANAGEMENT INTERRUPT )

    [我所認知的BIOS]->SMM (System management mode 学习笔记) By LightSeed 2009-9-11 1.System management mode综述 ...

  2. 【我所認知的BIOS】—gt;ADU.exe

    [我所認知的BIOS]->ADU.exe By LightSeed 2009-5-12 1.概要 在學習的過程中,肯定會要用不少的工具,作為底層的engineer那麼用的工具大多是DOS下.在D ...

  3. 【我所認知的BIOS】—Super IO

    [我所認知的BIOS]->Super IO By LightSeed 2009-9-2 1.Superio概述 Super I/O芯片也叫I/O芯片.在486以上档次的主板上都有I/O控制电路. ...

  4. 对[我所认识的BIOS]系列 -- CPU的第一条指令 一文扩充(III):从源代码到 FFS 文件

    我们可以在\Build\NT32IA32\DEBUG_VS2013\IA32\MdeModulePkg\Universal\BdsDxe\BdsDxe\OUTPUT\ 目录下,找到编译生成的 BdsD ...

  5. 对[我所认识的BIOS]系列 -- CPU的第一条指令 一文扩充(II):从FDF到Bios Rom image

    在"对[我所认识的BIOS]系列 -- CPU的第一条指令 一文扩充(I)"一文中,我用EFITool工具加载了BIOS Rom,发现Reset Vector位于BIOS Rom ...

  6. 计算机开机执行的第一条指令是什么?

    第一条指令的位置在FFFF:0000,也就是物理地址FFFF0.第一条指令是跳转到F000:EO5B. 接下来准备由实模式进入保护模式.加载GDT,置PE位为1,清指令预取队列并真正进入保护模式. 那 ...

  7. CPU加电后第一条指令

    当我们按下电源开关时,电源就开始向主板和其它设备供电,此时电压还不太稳定,主板上的控制芯片组会向CPU发出并保持一个RESET(重置)信号,让 CPU内部自动恢复到初始状态,但CPU在此刻不会马上执行 ...

  8. 自己动手写CPU(1)五级流水线及CPU第一条指令ori

    自己动手写CPU(1)五级流水线及CPU第一条指令ori 动机 不知为何研一的自由时间突然多起来,可能人一闲下来就容易焦虑吧,hhhhhh.正好之前看到一本<自己动手写CPU>,就按照此书 ...

  9. verilog实现多周期处理器之——(二)第一条指令ori的实现

    本博文希望对于OpenMIPS第一条指令ori加以实现并总结.会加入一些基本的理论以及博主的学习记录. 流水与五级流水 什么是流水:拆分,并行.将多条指令的执行相互重叠起来.就构成了流水,这样充分利用 ...

最新文章

  1. JavaWeb中验证码校验的功能实现
  2. SAP 货币转换中的转换因子
  3. 机器学习理论《统计学习方法》学习笔记:第十章 隐马尔可夫模型(HMM)
  4. js 随机1-10随机数_寻找随机的错误-一个真实的故事
  5. udp 使用connect优点_一文搞懂TCP和UDP的区别
  6. ES6的Promise -- 逻辑执行的顺序
  7. JAVA中pin什么意思_银行业加密算法,PIN相关算法(java-国密)
  8. 公网端口不够用,用这款神器轻松搞定它!
  9. Hadoop 2.6.0 HA高可用集群配置详解
  10. 洛谷OJ - P1316 - 丢瓶盖(二分答案)
  11. 浅谈-国标GB28181协议上下级对接国标编码要求(四)
  12. dnastar拼接反向互补序列_DNAstar使用说明
  13. oracle8i odac for c,ODAC112021Xcopy for 32位
  14. window定时自动关机脚本及问题解决【AT指令和SCHTASKS指令两种方式】
  15. ZZULIOJ 1196: 数星星(二)(结构体专题)
  16. Muse-UI自定义主题的使用方法
  17. 求小于整数N的最大素数
  18. qt 图片适应窗口_Qt图片自适应窗口控件大小
  19. 机器学习有哪些应用?可以用来做什么?
  20. varchar和char的区别

热门文章

  1. rgb sw 线主板接口在哪_RGB实用兼具:火鸟 黎明至尊 ARGB机箱 上机体验
  2. rabbitMQ配置外网连接
  3. 早晨看到的七彩云,据说是祥瑞
  4. 图像算法OR音视频传输
  5. php怎么给超链接设置样式,html中如何设置超链接的样式
  6. 2019 数据库流行趋势 --非国内
  7. 需知的Java大数据开发应用领域
  8. ccf 201703-4 地铁修建(100分)
  9. python 数据结构转换层_[mcj]使用OpenCV深度学习进行性别和年龄分类(C++/Python)...
  10. 对温州服装企业创名牌模式的分析(摘)