开机后的第一条指令

2019-04-14 21:10发布

关于电脑加电后的第一条指令,有很多人在网络上问过,但解答并不是那么的清晰,csdn论坛上也有很多这类的讨论帖, 例如:CPU在RSET后的第一条执行指令的地址问题请教x86的启动过程,cpu如何自举第一条指令? 、开机第一条指令是如何取到和执行的? 存在问题的地方大概是这么几点: 1.第一条指令的地址是什么 2.第一条指令的地址为什么是0xFFFFFFF0 3.第一条指令存储在什么地方 4.BIOS代码块映射在什么位置 5.第一条指令的内容是什么
然后挨个解答。。。。。。。 ---------------------------------------------------------------------------------------------------------------------------------------------------------- 一、第一条指令的地址是什么
这个问题网上有两种解答,0xFFFFFFF0,0xFFFF0。当然第一种是对的,这个在intel手册第三卷第9章有详细说明,第一条指令的地址为0xFFFFFFF0 这个地址自从intel发布80386后就延续下来
第二种地址在早年间也是对的,在intel还在使用16位cpu的时候,8086,8088,地址空间为1M,第一条指令的地址就是0xFFFF0了,回答这种地址的应该看的是早年的书,现在pc机已经不再使用了这是加电后寄存器的初始值 又或者是拿16位实模式说事,PC刚开机时确是16位实模式,这种模式的地址计算方式是使用CS和EIP寄存器中的值(Selector*16+EIP),这么算下来确实是0xFFFF0。但是刚开机时并不是使用这种计算方式,虽然还在16位模式。但intel规定的是当CS中的初始值被改变后才使用这种一般的地址计算方式。未改变之前用Base+EIP来生成地址,所以还是0xFFFFFFF0 原文:

---------------------------------------------------------------------------------------------------------------------------------------------------------- 二、第一条指令的地址为什么是0xFFFFFFF0 这个也没为什么,当初就这么设定了,人为规定
---------------------------------------------------------------------------------------------------------------------------------------------------------- 三、第一条指令存储在什么地方
也有很多人问这个问题,指令肯定是在EPROM中了,刚开机时内存中什么都没。
----------------------------------------------------------------------------------------------------------------------------------------------------------
四、BIOS代码块映射在什么位置
BIOS代码肯定是储存在EPROM中的,这时cpu如何访问?靠地址映射,硬件会把EPROM映 射在两个地方,一个是从0xFFFFFFFF(4GB)处向下扩展,一个是从0xFFFFF(1MB)处向下扩
第一个映射是因为第一条指令在0xFFFFFFF0,所以EPROM必须在那个位置。第二个映射是为了兼容,在16位时代就有了。 另外地址映射是占据地址空间,所以纵使你的pc机只有2G内存也没事,因为并没用内存, 使用的只是地址空间,只是把那块地址分配给了EPROM。这也就是为什么32位系统只 能使用4G内存,因为32位下只有4G的地址空间,内存再大就没地址分配了,所以读 取不到了。 另外好多人会碰到这个占用过大,这也是地址空间的问题。网上好多人发帖用 什么系统32位换64位,一会又设置msconfig,只能说Go play with your balls。。。如果系统本来 就是64位呢,还要换128位么敲打。这就是硬件厂家把显卡或是别的什么rom,ram区给映射到了常用的地址 空间,地址空间一占,内存就没得用了,所以就保留了,至于占用过大还是换电脑把。
----------------------------------------------------------------------------------------------------------------------------------------------------------
五、第一条指令的内容是什么
这个也是比较容易混乱的地方,大多数人说第一条指令是个长跳转(long jmp),跳转到0~0xFFFFF(0~1MB)这一段,然后再执行BIOS剩余的指令。然而又有一部分人看到intel手册第3卷的9.1.4节有这么一段话
这里又说不让有长跳转。其实两种都对,intel手册上说的是让BIOS在高地址空间运行,期间一直不修改CS寄存器,也就一直使用Base+EIP的方式生成地址,这种新式做法应该是UEFI的 那种刚开始就长跳转的属于老式做法, 在qemu中导出的第一条汇编指令是这个样子0xfffffff0:  ljmp   $0xf000,$0xe05b