社区
C语言
帖子详情
关于机器上电后执行的第一条指令问题
JerKii
2008-09-04 10:08:45
看过Intel的技术文档,说机器上电后CPU内部的EIP寄存器被置为0xFFFFFFFE,我所不能理解的是,这个是个什么地址?很显然他不是一个有效的物理地址啊,既然不是物理地址那么它又是如何读取要被执行的指令的呢?另外,由于机器上电后处于实模式,这这个模式下,0xFFFFFFFE这样的地址为什么是合法的啊?
...全文
833
34
打赏
收藏
关于机器上电后执行的第一条指令问题
看过Intel的技术文档,说机器上电后CPU内部的EIP寄存器被置为0xFFFFFFFE,我所不能理解的是,这个是个什么地址?很显然他不是一个有效的物理地址啊,既然不是物理地址那么它又是如何读取要被执行的指令的呢?另外,由于机器上电后处于实模式,这这个模式下,0xFFFFFFFE这样的地址为什么是合法的啊?
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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)
计算机开机后
执行
的
第一条
指令
,关于CPU上电读
第一条
指令
的
问题
该楼层疑似违规已被系统折叠隐藏此楼查看此楼这个
问题
困扰了我好久,老是想不明白,请大家指点一下。CPU
上电后
会从某个固定的地方读
指令
。假设Norflash的地址是 0xbd000000, Nandflash的地址是0xbfc00000.一、如果是从Norflash启动的,CPU一上电就会从0xbd000000地址出开始读
指令
。直接读出来
第一条
指令
,放到寄存器里, 然后译码,接着就
执行
第一条
指令
了。...
PC加电后,CPU如何
执行
第一条
指令
问题
:CPU是如何
执行
第一条
指令
的? 小
问题
:8086年代,为什么
第一条
指令
的位置在F000H:FFF0H? 小
问题
:为什么
第一条
指令
放在ROM中? 带着这些
问题
,我开始对cpu
执行
第一条
指令
开始研究。 加电后的启动流程 CPU首先会进行硬件初始化(hardware reset)。 然后是可选的自检过程(BIST built-in self-test)。 CPU开始
执行
第一条
指令
。从此开始CPU进入软件初始化过程。 在处理器的众多的引脚中,有一个RESET,由于接受复位信号,没当处理器加电,处理器都会执
CPU加电
执行
的
第一条
指令
参考了member82的这篇博客 当按下开关时,刚开始电压不稳定,主板会给cpu发出并保持RESET信号,rangCPU自动恢复到初 始状态,当芯片组检测到稳定供电时,便撤去了RESET信号,CPU开始
执行
第一条
指令
. 2.
第一条
指令
在哪? 首先可以肯定的是刚加电是RAM是没有内容的,所以
第一条
指令
一定是在ROM上. cpu想要
执行
ROM中的代码,靠的就是地址映射,硬件会把EPROM映射在两个...
计算机加电后
执行
的
第一条
指令
第一步: 当我们按下电源开关时,电源就开始向主板和其它设备供电,此时电压还不太稳定,主板上的控制芯片组会向cpu发出并保持一个reset(重置)信号,让cpu内部自动恢复到初始状态,但cpu在此刻不会马上
执行
指令
。当芯片组检测到电源已经开始稳定供电了(当然从不稳定到稳定的过程只是一瞬间的事情),它便撤去reset信号(如果是手工按下计算机面板上的reset按钮来重启
机器
,那么松开该按钮时芯片组就会
开机后的
第一条
指令
关于电脑加电后的
第一条
指令
,有很多人在网络上问过,但解答并不是那么的清晰,csdn论坛上也有很多这类的讨论帖, 例如:CPU在RSET后的
第一条
执行
指令
的地址
问题
、请教x86的启动过程,cpu如何自举
第一条
指令
? 、开机
第一条
指令
是如何取到和
执行
的? 存在
问题
的地方大概是这么几点: 1.
第一条
指令
的地址是什么 2.
第一条
指令
的地址为什么是0xFFFFFFF0 3.
第一条
指令
存储在什么地方
C语言
70,023
社区成员
243,253
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章