开机后的第一条指令

关于电脑加电后的第一条指令,有很多人在网络上问过,但解答并不是那么的清晰,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

  • 10
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值