CPU加电执行的第一条指令


参考了member82的这篇博客

当按下开关时,刚开始电压不稳定,主板会给cpu发出并保持RESET信号,rangCPU自动恢复到初 始状态,当芯片组检测到稳定供电时,便撤去了RESET信号,CPU开始执行第一条指令.

2.第一条指令在哪?

首先可以肯定的是刚加电是RAM是没有内容的,所以第一条指令一定是在ROM上.
cpu想要执行ROM中的代码,靠的就是地址映射,硬件会把EPROM映射在两个地方,一个是0XFFFFFFFF(4GB)向下扩展,一个是从0XFFFFF(1MB)向下扩展
值得 注意的是:地址映射只是占用了地址空间,并没有使用内存,只是将那块的内存地址分配给了ROM.
####

2.第一条地址是什么?

0XFFFFFFF0H 是对的,它是物理地址空间的最高16个Byte.
0FFFF0H也是对的,这是对于早期的8086,8088处理器的16位机时代 ,最高的16个Byte就是从 0FFFF0H开始的

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

从0FFFFFFF0~0FFFFFFFF的十六个字节分配为ROM地址,执行ROM里面的第一条FAR JMP(子0xfffffff0: ljmp $0xf000,$0xe05b)指令,长跳转至1MB以下,即就是BIOS第一条指令,这样CPU就可以继续执行BIOS中的代码
8086:CPU reset之后cs寄存器的值是0xFFFF,ip寄存器的值是0x0,所以形成的物理地址是0xFFFF0,这个地址就是1M往下16字节的位置


80286:CPU reset之后cs寄存器的值是0xF000,ip寄存器的值是0xFFF0,所以形成的物理地址也是0xFFFF0
80386:到了386时代一切都变了,此时在CPU reset之后cs寄存器的值仍然是0xF000,但是cs除了段选择子之外还有一个隐藏的基址寄存器,这个寄存器的值是0xFFFF0000,ip寄存器的值仍然是0xFFF0。此时的地址不在是0xF000左移4位加上0xFFF0了,而是0xFFFF0000 + 0xFFF0 = 0xFFFFFFF0。所以第一条指令是在一个很高的地址,是4G往下16字节的位置。


猜你喜欢

转载自blog.csdn.net/MIMOCH/article/details/89167971