电脑CPU开机上电后的第一条指令
电脑CPU开机上电后的第⼀条指令
结合上⾯的⽂章,CPU上电后第⼀条指令是通过CS:IP来指定的,CPU⼚家会给其初始值,对于386处理器来说,CPU第⼀条指令地址是                  0xFFFFFFF0
  这⾥会有⼀个问题,CPU怎么能⼀上来就去0xFFFFFFF0取指令呢?因为此时的内存都没有初始化呢,内存中什么都没有,第⼀条指令毫⽆疑问肯定在BIOS中,现在⽤来烧写BIOS的Flash芯⽚⼀般也就256KB、1MB、4MB,都是⾮常⼩的,怎么也没有0xFFFFFFF0这个地址的。
  这⾥就需要说⼀下x86的地址编码⽅式了,我们平时说的内存,主存是指RAM,但是这⾥会有些问题,因为RAM是从0开始的⼀个地址范围,⽽ROM也是从0开始的⼀个地址范围,当我们要访问⼀个地址,⽐如0x100,此时到底是去RAM⾥还是去ROM⾥呢?
  x86解决这个问题的⽅法是“统⼀编码”,也可以叫做地址映射,也就是在CPU眼⾥,它只看到⼀块打的空间,对于32位CPU,从0开始,4G结束,64位的CPU最⼤范围就更⼤了,CPU才不懂什么叫RAM,什么叫ROM,什么叫硬盘的,地址映射的概念就是给地址分段,不同位置是有不同的作⽤的,⼤部分是⽤来给程序运⾏的RAM的,但还有部分是映射给ROM,IO或者其他设备,下图是⼀种典型的地址映射关系:
rom是什么
  那么问题⼜来了,上⾯不是说CPU上电后会去0xFFFFFFF0处取第⼀条指令,这条指令肯定是在BIOS中,但是上图中BIOS的映射地址时0xF0000,这个就有点懵了,到底是为什么呢?那么BIOS代码到底映射在什么位置呢?
  答案是--两个地址都有,BIOS的代码肯定是存在EPROM中的,CPU中的硬件回把EPROM芯⽚映射到2个地⽅,⼀个是从
0xFFFFFFFF(4G)处向下扩展,⼀个是从0xFFFFF(1MB)处向下扩展,第⼀个映射是因为第⼀条指令在0xFFFFFFF0处,所以EPROM必须在哪个位置,第⼆个映射是为了兼容,在16位时代就有了,另外地址映射是占据地址空间,总是你的PC机只有2G内存也没关系,因为病没有使⽤内存,使⽤的只是地址空间,所到底对于CPU来说,它才不知道哪是哪,它只知道服从硬件安排,上⾯的所有所有地址映射,都是给程序员看的,不是给CPU看的,CPU只认各种“门”电路。
  那么第⼀条指令的内容是什么呢?
  这是⽐较容易产⽣混淆的地⽅,多数⼈说第⼀条指令是个长跳转(long jmp),跳转到0~0xFFFFF(0-1MB)这⼀段,然后再执⾏BIOS剩余的指令,但是intel⼿册中却⼜这么⼀段话:
   简单的说,就是不让有长跳转动作,其实这两种都对,intel⼿册上说的是让BIOS在⾼地址空间运
⾏,器件⼀直修改CS寄存器,也就是⼀直使⽤Base+EIP的⽅式⽣成地址,这种新式⽅法应该是UEFI的,那种刚开始就长跳转的属于⽼式做法。
  假设有⼀块1M的flash芯⽚,第⼀条指令⼀般都是在0xFFFF0的这个位置,这样的原因,我们可以很简单的想到,这是为了把这1M空间⽅便的映射到4G地址中最⾼的1M中吧,可能看起来⽐较对齐吧。
  BIOS也就是ROM的地址空间通过CPU的硬件⾃动映射到了⾼地址1M,但是我们平时看到的都是低于1M的BIOS,因为在⾼地址的时候,CPU实际上是在访问ROM,这段时间内,基本的操作就是硬件初始化,最重要的肯定是RAM等重要硬件的初始化,初始化完成
后,CPU根据BIOS中的“搬家”代码,回将ROM的所有内容拷贝到RAM中(整体拷贝⽐较⽅便,如果是想着把前⾯执⾏过的剔除掉,得不偿失),当然这个位置肯定就是低1M的地址空间,⽐如上图中,从0xF0000开始的那64Kb空间(放⼼,⼀般的BIOS不会超过64KB),拷贝完成后,CPU会执⾏⼀条长跳转,这会引起CS寄存器的改变,也就会控制CPU指向RAM进⾏执⾏程序了,这样带来2个好处,第⼀肯定是RAM⽐ROM更快,第⼆是这样重新满⾜了实模式下寻址范围是1M的这⼀特点,当然CPU寻址⽅式回重新回归到CS左移4位+IP的模式。
  到这⾥还有⼀些疑问:我们⼀般会认为第⼀条紫菱本⾝就是⼀条长跳转指令,那么CPU是怎么完成内存初始化后,并将BIOS相关数据拷贝到1M以下地址空间呢?这⾥有⼏种可能(⽅便说服内⼼的猜测)
,第⼀是这条指令并不是真正的长跳转,⽽是先进⾏⼀些基本的初始化,才跳转,第⼆是ROM到地址空间的映射并不是简单的映射到搞地质的1M,⽽是有着更复杂的映射⽅式,使得长跳转后时间上CPU还是在访问ROM,第三就是CPU⼀旦上电,就⾃动的由硬件将BIOS内容复制到对应的RAM中,这⼀点在ARM9的⼯作模式可以验证。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。