CPU加电后第一条指令

当我们按下电源开关时,电源就开始向主板和其它设备供电,此时电压还不太稳定,主板上的控制芯片组会向CPU发出并保持一个RESET(重置)信号,让 CPU内部自动恢复到初始状态,但CPU在此刻不会马上执行指令。当芯片组检测到电源已经开始稳定供电了(当然从不稳定到稳定的过程只是一瞬间的事情),它便撤去RESET信号(如果是手工按下计算机面板上的Reset按钮来重启机器,那么松开该按钮时芯片组就会撤去RESET信号),CPU马上开始执行第一条指令。下面我们来讨论一下有关第一条指令。

1.第一条指令在哪?

我们知道,计算机刚加电的时候RAM(内存条)里面是没有内容的,所以第一条指令当然是在ROM(固化在主板上)里,刚开机内存中什么都没有。

那既然RAM中是空的,我们怎么去执行ROM中的代码呢,靠的是地址映射。硬件会把EPROM映射在两个地方,一个是从0xFFFFFFFF(4GB)处向下扩展,一个是从0xFFFFF(1MB)处向下扩展。

注:另外地址映射是占据地址空间,所以纵使你的pc机只有2G内存也没事,因为并没用内存,使用的只是地址空间,只是把那块地址分配给了EPROM。

2.第一条指令的地址是什么?

既然硬件将ROM中的内容映射到了内存上,那么CPU就可以通过地址来访问ROM中的内容。那第一条指令的地址是什么呢?有两种解释:0xFFFFFFF0H0xFFFF0H。Intel的手册上如是说:

也就是0xFFFFFFF0H是对的,它是物理地址空间的最高16字节。

有关第二种,0FFFF0H这种说法其实在早期Intel 8088,8086 处理器的16位时代,地址空间为1M,物理地址空间的最高16字节就是从0xFFFF0H开始的,即第一条指令的地址就是0xFFFF0H。现在已经不使用了,但是为了保持兼容性,这两个地方的内容还是一样的,因为上文提到的地址映射。硬件会把EPROM映射在两个地方,一个是从0xFFFFFFFF(4GB)处向下扩展,一个是从0xFFFFF(1MB)处向下扩展。在单步跟踪调试BIOS时证实两个内容确实时一样的。

还有,按照16位模式下的物理地址和逻辑地址的转换方式。物理地址=(CS*16)+IP,即CS寄存器的值左移4位,加上IP的值,这么算下来,的确也是0xFFFF0H。因为加电后寄存器的初值为:


(CS*16)+EIP=(0xF000H*16)+0xFFF0H=0xFFFF0H。

但是,刚开始的时候并不是这种计算方式,虽然在16位实模式,但是Intel规定是当CS中的初始值被改变后才使用这种一般的地址计算方式。未改变之前用Base+EIP来生成地址,所以还是0xFFFFFFF0

3.第一条指令的内容是什么?

第一条指令的内容是一条长跳转指令:0xfffffff0:  ljmp   $0xf000,$0xe05b。第一条指令地址=CS中不可见部分的BaseAddress+EIP=FFFFFFFF0,从FFFFFFF0-FFFFFFFF的十六个字节分配为ROM地址,然后执行ROM里面的第一条FAR JMP指令,此时CS被修改(虽然值未变仍然是F000,但不可见部分的BaseAdress变了,000F0000),此时得到第二条指令的地址000FE05B,位于1M以下。这样CPU就可以继续执行BIOS中的代码。那么BIOS存在于什么位置?


我们先来看看内存的内存的分配:

我们可能经常听到一些只有在PC机上才有的一些关于存储器的专有名词,包括:常规内存(Conventional Memory)、上位内存区(Upper Memory Area)、高端内存区(High Memory Area)和扩展内存(Extended Memory),我尽量把这几个东东说明白,这需要下面这张著名的图。


这张图很清楚地说明了问题,大家都知道,DOS下的“常规内存”只有640K,这640K就是从0--A0000H这段地址空间;所谓“上位内存区”,指的就是20位地址线所能寻址到的1M地址空间的上面384K空间,就是从A0001H--100000H这段地址空间,也就是我们说的用于ROM和系统设备的地址区域,这384K空间和常规内存的640K空间加起来就是20位地址线所能寻址的完整空间1024KB;由于80286和80386的出现使PC机的地址线从20位变成24位又变成32位,寻址能力极大地增加,1M以上的内存寻址空间,我们统称为“扩展内存”;这里面绝大部分内存区域只能在保护模式下才能寻址到,但有一部分既可以在保护模式下,也可以在实模式下寻址,这就是我们前面提到过的地址100000h--10ffefh之间的这块内存,(也就是在16实模式的地址转换机制下能表示但是已经超过实际的1M空间的那段地址)为了表明其特殊性,我们把这块有趣的内存区叫做“高端内存”。


PC机的设计师将1MB中的低端640KB用作RAM,供DOS及应用程序使用;高端的384KB则保留给ROM、视频适配卡等系统使用。从此,这个界限便被确定了下来并且沿用至今。低端的640KB就被称为常规内存即PC机的基本RAM区。保留内存中的低128KB是显示缓冲区,高64KB是系统 BIOS(基本输入/输出系统)空间,其余192KB空间留用


注:本文为我通过查阅网上资料以及参考intel开发手册得出的结论,如有疑问或错误,欢迎讨论指正。

前两天发现一篇解释的不错的文章:基于Intel 80×86 CPU的IBM PC及其兼容计算机的启动流程-博客-云栖社区-阿里云

你可能感兴趣的:(技术工具)