社区
C语言
帖子详情
关于机器上电后执行的第一条指令问题
JerKii
2008-09-04 10:08:45
看过Intel的技术文档,说机器上电后CPU内部的EIP寄存器被置为0xFFFFFFFE,我所不能理解的是,这个是个什么地址?很显然他不是一个有效的物理地址啊,既然不是物理地址那么它又是如何读取要被执行的指令的呢?另外,由于机器上电后处于实模式,这这个模式下,0xFFFFFFFE这样的地址为什么是合法的啊?
...全文
795
34
打赏
收藏
关于机器上电后执行的第一条指令问题
看过Intel的技术文档,说机器上电后CPU内部的EIP寄存器被置为0xFFFFFFFE,我所不能理解的是,这个是个什么地址?很显然他不是一个有效的物理地址啊,既然不是物理地址那么它又是如何读取要被执行的指令的呢?另外,由于机器上电后处于实模式,这这个模式下,0xFFFFFFFE这样的地址为什么是合法的啊?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
34 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
bxhzct
2008-12-08
打赏
举报
回复
CMOS
youxizhizuo
2008-12-08
打赏
举报
回复
只听过BIOS自启动引导读盘。
xiaopoy
2008-12-08
打赏
举报
回复
(that is, FFFF0000 + FFF0H = FFFFFFF0H).
LZ你发的文章已经完美的解释了原因
e_sharp
2008-12-07
打赏
举报
回复
UP
JerKii
2008-12-07
打赏
举报
回复
经过一段时间的学习,我总结如下,也算是对这个主题的结束语吧!
我们知道,Intel的CPU在上电后CS:EIP被设置成F000:FFFFFFF0,由于是刚上电,因此系统的主存储器还处于不可用状态,也就是说此时CPU执行的指令肯定不会来自主存储器中。并且我们知道,在初始情况下CPU的A20地址线是处于disabled状态的,因此F000:FFFFFFF0也就会变成F000:FFF0,也就是实模式下的FFFF0。因为CPU与主存储器之间不是直接进行连接的,而是要通过一个北桥芯片(如E7505 MCH, 855PM等等),通常北桥芯片中决定了当前系统所能支持的最大物理内存,如855GM只能支持2G的物理内存,但是对于32bit地址线的CPU,他有4G的物理地址空间,MCH会对当前的物理地址空间进行分区域(region)进行管理,这些区域可以由系统软件如BIOS或OS系统进行配置,MCH会将CPU的地址访问forward到不同的物理设备中。但是有一些物理地址空间区域的映射是固定的(即一些缺省的设置),如0F0000H - 0FFFFFH就是被直接映射到位于扩展总线上的BIOS中的ROM芯片的!因此,在上电后,我们的BIOS会被首次访问。然后CPU将按照在BIOS的ROM中存储的指令运行(当然,通常这些指令为系统初始化指令,如POST程序等)。
在通常的BIOS的实现中,都会在0FFFF0 - 0FFFFF出存放一条far jmp指令,该指令直接跳转到POST程序的入口处(当然,这个POST程序也位于F0000 - FFFFF中,它是BIOS的一部分),POST需要做的事通常包括芯片组初始化、CPU初始化、主存储器初始化、实模式下的中断服务例程初始化(如我们常用到的10h,13h,19h等等),在一些列初始化操作完成后,我们的主存储器、硬盘等都可用了(一般通过BIOS提供的中断例程对这些设备进行访问),然后就进行OS的引导了!在OS的引导过程中,BIOS直接将引导扇区中的512字节装载到7c000处,然后直接从该处开始就将CPU的控制权交给OS的引导程序了。
另外,我们常听说BIOS会将自己搬移(shadow)到主存储中,为什么需要这样做呢?我们刚才说过,在上电之后,虽然CPU对物理地址FFFF0进行访问,但我们知道,因为此时主存储器尚处在不可用状态,因此,MCH根据自身的设置(对F0000 - FFFFF这段区域的设置)会将给访问forward给ICH,由于BIOS位于扩展总线上(如ISA等总线),因此ICH可以很容易地对BIOS中的ROM进行寻址!但是,当我们的主存储器初始化完成后,为了加快对BIOS中的中断服务例程的访问,因此我们需要将BIOS自身搬移至主存储器中,那么,搬移到哪里呢?为了简单期间,BIOS将其自身搬移到主内存中的F0000 - FFFFF,并对F0000 - FFFFF这段区域的读写重新进行设置,以至于后续对该段的访问不会再被MCH forward到位于扩展总线上的BIOS中!
用户 昵称
2008-09-07
打赏
举报
回复
甭说这个地址是否有效,就是开机跳到88888888888888888888,也只是说明开机时有一条固定指令而已。
JerKii
2008-09-07
打赏
举报
回复
也就是说0xFFFFFFF0这个地址被“映射”到EPROM,事实上是由于在系统初始化间A20-A31之间的地址信号线被置1,从而使0xFFFF0变成0xFFFFFFF0了。而不是通过桥片来映射的了?
另外,这种地址是不是跟CPU的设计有关?比如说intel的cpu就要求将EPROM的地址映射到0xFFFFFFF0,而其他CPU可能会使用其他地址?
johnelf
2008-09-06
打赏
举报
回复
[Quote=引用 8 楼 bshawk 的回复:]
在 FFFFFFF0H位置是一条跳转指令,会跳转到bios所在的物理位置开始执行!
[/Quote]
这就是我想说的
guolisen
2008-09-06
打赏
举报
回复
[Quote=引用 19 楼 aca_jingru 的回复:]
这个地址有效..虽然开机运行在实模式,寻址范围为1m,但是cpu强制a20以后的线为1,得到物理地址是ffff fff0,但是还没有转到保护模式,所以只能折回到ffff0这里地址,imb pc规定1m内存高地址端存放bios程序,bios本身是固化的rom,所以随时可以寻址到.
里面是一个jmp语句,跳到bios的引导程序,然后post,int 19h完成操作系统引导
我汗一下这段英文
The first instruction that is fetched and executed following a hardware reset…
[/Quote]
This address is 16 bytes below the processor’s uppermost physical
address
这段地址是处理器最高地址以下的16字节(即0xFFFFFFF0)
bytes是“字节”~~~不是“位”
zwspider
2008-09-06
打赏
举报
回复
学习~
babanake
2008-09-06
打赏
举报
回复
跳转到 内存的最高位置,执行一个跳转指令。
K行天下
2008-09-06
打赏
举报
回复
跳转指令
过去的我
2008-09-06
打赏
举报
回复
FFFFFFF0H 得到的物里地址是不假,但是实模式a20以后的线还没接通,所以只能折回到ffff0这个地址
过去的我
2008-09-06
打赏
举报
回复
这个地址有效..虽然开机运行在实模式,寻址范围为1m,但是cpu强制a20以后的线为1,得到物理地址是ffff fff0,但是还没有转到保护模式,所以只能折回到ffff0这里地址,imb pc规定1m内存高地址端存放bios程序,bios本身是固化的rom,所以随时可以寻址到.
里面是一个jmp语句,跳到bios的引导程序,然后post,int 19h完成操作系统引导
我汗一下这段英文
The first instruction that is fetched and executed following a hardware reset is located at physical
address FFFFFFF0H. This address is 16 bytes below the processor’s uppermost physical
address
FFFFFFF0H 是16位? 他怎么算的..4*8=32位,里面描述的也不对,这段英文我觉得是错的
而且
(that is, FFFF0000 + FFF0H = FFFFFFF0H).
我觉得应该是 ffff0 +fff0 0000 得出的
realdragon2
2008-09-06
打赏
举报
回复
mark~ 学习.
ChamPagneZ
2008-09-06
打赏
举报
回复
//UP
色郎中
2008-09-06
打赏
举报
回复
FFF0 处是一个JMP指令,将跳转到BIOS的实际地址,然后就是BIOS查找各种硬件资源,找到硬盘之后,读取MBR
硬盘头512个字节,通过MBR(主引导目录)完成BIOS-》操作系统
mifeixq
2008-09-05
打赏
举报
回复
FFF0 处是一个JMP指令,将跳转到BIOS的实际地址,然后就是BIOS查找各种硬件资源,找到硬盘之后,读取MBR
硬盘头512个字节,通过MBR(主引导目录)完成BIOS-》操作系统
大体上就是这么个过程……
lunarfan
2008-09-05
打赏
举报
回复
up
zenny_chen
2008-09-05
打赏
举报
回复
如果像楼上几位所说的0xfffffff0就是BIOS的地址的话,那么第一条指令就是在BIOS中被获取的。
加载更多回复(14)
java虚拟机jvm性能调优实战+面试
JVM在
执行
字节码时,实际上最终还是把字节码解释成具体平台上的
机器
指令
执行
。 Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,...
计算机开机后
执行
的
第一条
指令
,关于CPU上电读
第一条
指令
的
问题
该楼层疑似违规已被系统折叠隐藏此楼查看此楼这个
问题
困扰了我好久,老是想不明白,请大家指点一下。CPU
上电后
会从某个固定的地方读...直接读出来
第一条
指令
,放到寄存器里, 然后译码,接着就
执行
第一条
指令
了。...
PC加电后,CPU如何
执行
第一条
指令
问题
:CPU是如何
执行
第一条
指令
的? 小
问题
:8086年代,为什么
第一条
指令
的位置在F000H:FFF0H? 小
问题
:为什么
第一条
指令
放在ROM中? 带着这些
问题
,我开始对cpu
执行
第一条
指令
开始研究。 加电后的启动流程 CPU...
CPU加电
执行
的
第一条
指令
当按下开关时,刚开始电压不稳定,主板会给cpu发出并保持RESET信号,rangCPU自动恢复到初 始状态,当芯片组检测到稳定供电时,便撤去了RESET信号,CPU开始
执行
第一条
指令
. 2.
第一条
指令
在哪? 首先可以肯定的是刚加电是RAM...
计算机加电后
执行
的
第一条
指令
第一步: 当我们按下电源开关时,电源就开始向主板和其它设备供电,此时电压还不太稳定,主板上的控制芯片组会向cpu发出并保持一个reset(重置)信号,让cpu内部自动恢复到初始状态,但cpu在此刻不会马上
执行
指令
。...
C语言
69,371
社区成员
243,082
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章