wgqwdq
驱动牛犊
驱动牛犊
  • 注册日期2002-02-26
  • 最后登录2008-03-24
  • 粉丝0
  • 关注0
  • 积分12分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:3310回复:20

机器加电后的第一条指令?

楼主#
更多 发布于:2005-05-27 19:29
我看资料说rom bios被译址在4G地址边界上。那么机器加电后cpu执行的第一条指令是在rom空间的0xfffffff0处,还是在shadow ram空间的0xfff0处啊?如果是在rom空间中执行第一条指令,那么后来bios代码转移到到c000-ffffh的shadow ram中。是bios自己复制过去的还是有专门的硬件机制?shadow ram是有另外的硬件只占用ram的地址空间,还是在ram上开辟一部份空间呢?
  我很迷惑请高手解答!

[编辑 -  5/27/05 by  wgqwdq]

[编辑 -  5/27/05 by  wgqwdq]
KMK
KMK
驱动大牛
驱动大牛
  • 注册日期2001-09-12
  • 最后登录2017-10-06
  • 粉丝2
  • 关注0
  • 积分42分
  • 威望404点
  • 贡献值2点
  • 好评度58点
  • 原创分1分
  • 专家分1分
  • 社区居民
沙发#
发布于:2005-05-28 10:27
机器加电后cpu执行的第一条指令是在rom空间的0xfffffff0处
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-05-28 10:29
我看资料说rom bios被译址在4G地址边界上。那么机器加电后cpu执行的第一条指令是在rom空间的0xfffffff0处,还是在shadow ram空间的0xfff0处啊?如果是在rom空间中执行第一条指令,那么后来bios代码转移到到c000-ffffh的shadow ram中。是bios自己复制过去的还是有专门的硬件机制?shadow ram是有另外的硬件只占用ram的地址空间,还是在ram上开辟一部份空间呢?
  我很迷惑请高手解答!

[编辑 -  5/27/05 by  wgqwdq]

[编辑 -  5/27/05 by  wgqwdq]

其实机器刚加电进入的是实模式,根本看不到4G地址空间,所以第一条指令在ffff:0000处,注意这里给出的这个地址是按DOS下的段:偏移形式的,对应物理地址ffff0处,一般这里是个jmp语句
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
sharpor
驱动小牛
驱动小牛
  • 注册日期2005-04-04
  • 最后登录2007-05-10
  • 粉丝0
  • 关注0
  • 积分127分
  • 威望17点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-05-28 11:35
bmyyyud说的对,
北桥那边有专门的硬件转换机制。
你访问的c000-ffffh可以在rom和ram中切换。。。
tiamo
VIP专家组
VIP专家组
  • 注册日期2002-02-26
  • 最后登录2018-01-09
  • 粉丝17
  • 关注4
  • 积分50分
  • 威望142点
  • 贡献值1点
  • 好评度40点
  • 原创分2分
  • 专家分15分
  • 原创先锋奖
  • 社区居民
地下室#
发布于:2005-05-28 22:16
第一个指令是fffffff0

intel得段寄存器有个不可见得部分
每次寻址使用得是这个不可见得部分寻址得
只有在你修改段寄存器得时候
才用真正得段寄存器得值去更新这个不可见得部分

intel得cpu在加电以后
这个不可见得值不设置了
虽然cs保持在f000虽然那还是实模式
但是这个时候得cs不可见部分跟cs真实得值是不匹配的

以上为回忆结果..或许有差别
详细信息请查阅intel文档 vol3

bios的代码是自己在运行时复制过去的
是一个从rom 到ram的复制
跟硬件提供的映射功能完全是两回事
ram就是指你的内存...不是专门的硬件

以上
wgqwdq
驱动牛犊
驱动牛犊
  • 注册日期2002-02-26
  • 最后登录2008-03-24
  • 粉丝0
  • 关注0
  • 积分12分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-05-30 11:25
谢谢指点,但是到底是谁的正确呢,各位老大有没有这方面的资料啊?
sharpor
驱动小牛
驱动小牛
  • 注册日期2005-04-04
  • 最后登录2007-05-10
  • 粉丝0
  • 关注0
  • 积分127分
  • 威望17点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-05-30 13:48
第一个指令是fffffff0

intel得段寄存器有个不可见得部分
每次寻址使用得是这个不可见得部分寻址得
只有在你修改段寄存器得时候
才用真正得段寄存器得值去更新这个不可见得部分

intel得cpu在加电以后
这个不可见得值不设置了
虽然cs保持在f000虽然那还是实模式
但是这个时候得cs不可见部分跟cs真实得值是不匹配的

“请问,这时候cs不可见部分 值是什么,
你说的cs真实值又是什么???”
“至于北桥去不去切,是看是不是热启,是热启的话,北桥寄存器的值还保持原态,那时候cpu抓到的数据是ram,是个长跳转,冷启动肯定北桥用default值,cpu抓的是rom,是个短跳转。”

以上为回忆结果..或许有差别
详细信息请查阅intel文档 vol3

bios的代码是自己在运行时复制过去的
是一个从rom 到ram的复制
跟硬件提供的映射功能完全是两回事
ram就是指你的内存...不是专门的硬件
“不明白ram不是个专门的硬件是什么意思。。。
向来认为ram 就是个硬件。。。”
以上
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-05-30 15:51
第一个指令是fffffff0

intel得段寄存器有个不可见得部分
每次寻址使用得是这个不可见得部分寻址得
只有在你修改段寄存器得时候
才用真正得段寄存器得值去更新这个不可见得部分

intel得cpu在加电以后
这个不可见得值不设置了
虽然cs保持在f000虽然那还是实模式
但是这个时候得cs不可见部分跟cs真实得值是不匹配的

以上为回忆结果..或许有差别
详细信息请查阅intel文档 vol3

bios的代码是自己在运行时复制过去的
是一个从rom 到ram的复制
跟硬件提供的映射功能完全是两回事
ram就是指你的内存...不是专门的硬件

以上

tiamo就是tiamo,高,尤其是只有在你修改段寄存器得时候
才用真正得段寄存器得值去更新这个不可见得部分,我不禁惊诧于tiamo的记忆了
这个不可见的部分其实是为了避免每次都从内存中去存取段描述符带来的性能降低,在486及以后的32位CPU这个值是FFFF0000
这个特性最早来源于处理器设计的一个BUG,从而造成处理器并非是物理上完全兼容的,但却由此带来了一定的好处,使得内存即(RAM)和ROM不必从物理上交替存在。因此被保留了下来,大家可曾记得在实模式下可以存取大于1M以上空间,就是利用了这个特性,我所指的这个大于1M,不只局限于1M上的64K,这个又涉及到另一个处理器BUG,即Himem的由来,而是指4G空间,可见处理器的设计BUG也常常必须保留。
但这个特性很显然导致了与偶和sharpor所说的与以前处理器不兼容的情况,这样其实就导致了Shadow到底Shadow到哪里的问题
由于程序在ROM运行相对是比较慢的,因此Shadow就是将程序首先从ROM拷贝到RAM(内存)中运行,这样可以加快速度,然而拷贝到内存中的地址正好就是以前的物理地址为ffff0的地方,所以至今你仍会在这里看到一个Jmp语句,而且你可以想象地认为真正的执行从这里开始
不知我的以上是否准确,还请大家指正
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
sharpor
驱动小牛
驱动小牛
  • 注册日期2005-04-04
  • 最后登录2007-05-10
  • 粉丝0
  • 关注0
  • 积分127分
  • 威望17点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2005-05-30 16:33
tiamo就是tiamo,高,尤其是只有在你修改段寄存器得时候
才用真正得段寄存器得值去更新这个不可见得部分,我不禁惊诧于tiamo的记忆了
这个不可见的部分其实是为了避免每次都从内存中去存取段描述符带来的性能降低,在486及以后的32位CPU这个值是FFFF0000
这个特性最早来源于处理器设计的一个BUG,从而造成处理器并非是物理上完全兼容的,但却由此带来了一定的好处,使得内存即(RAM)和ROM不必从物理上交替存在。因此被保留了下来,大家可曾记得在实模式下可以存取大于1M以上空间,就是利用了这个特性,我所指的这个大于1M,不只局限于1M上的64K,这个又涉及到另一个处理器BUG,即Himem的由来,而是指4G空间,可见处理器的设计BUG也常常必须保留。
但这个特性很显然导致了与偶和sharpor所说的与以前处理器不兼容的情况,这样其实就导致了Shadow到底Shadow到哪里的问题
由于程序在ROM运行相对是比较慢的,因此Shadow就是将程序首先从ROM拷贝到RAM(内存)中运行,这样可以加快速度,然而拷贝到内存中的地址正好就是以前的物理地址为ffff0的地方,所以至今你仍会在这里看到一个Jmp语句,而且你可以想象地认为真正的执行从这里开始
不知我的以上是否准确,还请大家指正


你说的“Shadow就是将程序首先从ROM拷贝到RAM(内存)中运行,这样可以加快速度,然而拷贝到内存中的地址正好就是以前的物理地址为ffff0的地方”
是cpu会跑一小会儿rom的东东,然后test ram后,才把rom的东西copy到ram去跑。但是不是一下就跑到ffff0的,中间有个小小的切换的动作。
呵呵,我的疑惑就在这里了,因为冷启动上电同时,cpu跑的第一个指令是个near jmp,而这个near jmp正好如果这个时候cs是f000的话就和我们写的bios中bootblock的语句能对上,但是书上常常说这个时候cs是ffff,如果是ffff的话算下来就对不上了。。。所以我想弄清楚到底这个时候的cs是个什么样的状态。。。。值到底是什么。。。

[编辑 -  5/30/05 by  sharpor]
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2005-05-30 16:49
[quote]tiamo就是tiamo,高,尤其是只有在你修改段寄存器得时候
才用真正得段寄存器得值去更新这个不可见得部分,我不禁惊诧于tiamo的记忆了
这个不可见的部分其实是为了避免每次都从内存中去存取段描述符带来的性能降低,在486及以后的32位CPU这个值是FFFF0000
这个特性最早来源于处理器设计的一个BUG,从而造成处理器并非是物理上完全兼容的,但却由此带来了一定的好处,使得内存即(RAM)和ROM不必从物理上交替存在。因此被保留了下来,大家可曾记得在实模式下可以存取大于1M以上空间,就是利用了这个特性,我所指的这个大于1M,不只局限于1M上的64K,这个又涉及到另一个处理器BUG,即Himem的由来,而是指4G空间,可见处理器的设计BUG也常常必须保留。
但这个特性很显然导致了与偶和sharpor所说的与以前处理器不兼容的情况,这样其实就导致了Shadow到底Shadow到哪里的问题
由于程序在ROM运行相对是比较慢的,因此Shadow就是将程序首先从ROM拷贝到RAM(内存)中运行,这样可以加快速度,然而拷贝到内存中的地址正好就是以前的物理地址为ffff0的地方,所以至今你仍会在这里看到一个Jmp语句,而且你可以想象地认为真正的执行从这里开始
不知我的以上是否准确,还请大家指正


你说的“Shadow就是将程序首先从ROM拷贝到RAM(内存)中运行,这样可以加快速度,然而拷贝到内存中的地址正好就是以前的物理地址为ffff0的地方”
是cpu会跑一小会儿rom的东东,然后test ram后,才把rom的东西copy到ram去跑。但是不是一下就跑到ffff0的,中间有个小小的切换的动作。
呵呵,我的疑惑就在这里了,因为冷启动上电同时,cpu跑的第一个指令是个near jmp,而这个near jmp正好如果这个时候cs是f000的话就和我们写的bios中bootblock的语句能对上,但是书上常常说这个时候cs是ffff,如果是ffff的话算下来就对不上了。。。所以我想弄清楚到底这个时候的cs是个什么样的状态。。。。值到底是什么。。。

[编辑 -  5/30/05 by  sharpor] [/quote]
肯定会首先在rom上跑,ram里面乱七八糟的 :P
那个书上是错的,刚启动时cs确实是f000,EIP是0000fff0,这样符合你的想法,而且我都怀疑这个BUG是不是有意为之,还是天才的构想 :D
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2005-05-30 16:52
刚启动时cs确实是f000,EIP是0000fff0,这样符合你的想法,对于实模式下也惊奇地符合,这使我都怀疑这个BUG是不是有意为之,是天才的构想
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
wgqwdq
驱动牛犊
驱动牛犊
  • 注册日期2002-02-26
  • 最后登录2008-03-24
  • 粉丝0
  • 关注0
  • 积分12分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2005-06-03 08:56
这不是一个bug,这是为了加快寻址速度而设计的一个cache。谢谢指点。

[编辑 -  6/3/05 by  wgqwdq]
wgqwdq
驱动牛犊
驱动牛犊
  • 注册日期2002-02-26
  • 最后登录2008-03-24
  • 粉丝0
  • 关注0
  • 积分12分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2005-06-03 15:01
还有一个小小的疑问就是书上说:“打开A20地址线是为了能存取1M以上的内存,和进不进保护模式其实没有必然的联系,也就是说不打开A20也能进入保护模式,只不过这时在保护模式下就不能存取1M以上的内存了。”那么在实模式下a20是不是也和上面说的一样呢?power on后a20到底打没打开呢?
sharpor
驱动小牛
驱动小牛
  • 注册日期2005-04-04
  • 最后登录2007-05-10
  • 粉丝0
  • 关注0
  • 积分127分
  • 威望17点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2005-06-03 16:45
还有一个小小的疑问就是书上说:“打开A20地址线是为了能存取1M以上的内存,和进不进保护模式其实没有必然的联系,也就是说不打开A20也能进入保护模式,只不过这时在保护模式下就不能存取1M以上的内存了。”那么在实模式下a20是不是也和上面说的一样呢?power on后a20到底打没打开呢?

没有打开。。。要打开,可以下kbc command。。。
实模式下a20打开也访问不了1m上的内存。。。会回卷。。
但是如果先进保护模式,把访问内存的限制设到ffffffff再回实模式就可以访问

[编辑 -  6/3/05 by  sharpor]
wgqwdq
驱动牛犊
驱动牛犊
  • 注册日期2002-02-26
  • 最后登录2008-03-24
  • 粉丝0
  • 关注0
  • 积分12分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2005-06-07 15:26
但是不打开a20,怎么能上4g取bios执行呢?
sharpor
驱动小牛
驱动小牛
  • 注册日期2005-04-04
  • 最后登录2007-05-10
  • 粉丝0
  • 关注0
  • 积分127分
  • 威望17点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2005-06-08 10:22
但是不打开a20,怎么能上4g取bios执行呢?

肯定要先打开a20
wgqwdq
驱动牛犊
驱动牛犊
  • 注册日期2002-02-26
  • 最后登录2008-03-24
  • 粉丝0
  • 关注0
  • 积分12分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2005-06-08 13:57
[quote]但是不打开a20,怎么能上4g取bios执行呢?

肯定要先打开a20 [/quote]
intel文档上说power on后cpu第一条指令在4G以下16个字节处。从物理上看地址线a20-a31是应为1吧!但楼上sharpor说,power on后a20没打开,难道a20控制的不是a20-a31地址线么?或者power on时a20-a31都被初始置位了?
sharpor
驱动小牛
驱动小牛
  • 注册日期2005-04-04
  • 最后登录2007-05-10
  • 粉丝0
  • 关注0
  • 积分127分
  • 威望17点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2005-06-09 11:33
[quote][quote]但是不打开a20,怎么能上4g取bios执行呢?

肯定要先打开a20 [/quote]
intel文档上说power on后cpu第一条指令在4G以下16个字节处。从物理上看地址线a20-a31是应为1吧!但楼上sharpor说,power on后a20没打开,难道a20控制的不是a20-a31地址线么?或者power on时a20-a31都被初始置位了? [/quote]

a20是控制的a20-a31的地址线,但是,power on的时候cpu跑的第一条指令是f000:ffff,我们上面不是已经讨论过了吗。。。而当时的f000:ffff实际上是北桥那边控制映射的fffffff0的东西,也就是我们主板上的bios中的最后16个字节处。
wgqwdq
驱动牛犊
驱动牛犊
  • 注册日期2002-02-26
  • 最后登录2008-03-24
  • 粉丝0
  • 关注0
  • 积分12分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2005-06-09 11:41

a20是控制的a20-a31的地址线,但是,power on的时候cpu跑的第一条指令是f000:ffff,我们上面不是已经讨论过了吗。。。而当时的f000:ffff实际上是北桥那边控制映射的fffffff0的东西,也就是我们主板上的bios中的最后16个字节处。 [/quote]
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. The EPROM containing the software-initialization code must be located at this address.
The address FFFFFFF0H is beyond the 1-MByte addressable range of the processor while in
real-address mode. The processor is initialized to this starting address as follows. The CS
register has two parts: the visible segment selector part and the hidden base address part. In realaddress
mode, the base address is normally formed by shifting the 16-bit segment selector value
4 bits to the left to produce a 20-bit base address. However, during a hardware reset, the segment
selector in the CS register is loaded with F000H and the base address is loaded with
FFFF0000H. The starting address is thus formed by adding the base address to the value in the
EIP register (that is, FFFF0000 + FFF0H = FFFFFFF0H).
这时intel 手册上说的,这好像不是北桥映射吧!
sharpor
驱动小牛
驱动小牛
  • 注册日期2005-04-04
  • 最后登录2007-05-10
  • 粉丝0
  • 关注0
  • 积分127分
  • 威望17点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2005-06-09 13:40
哦?既然高端选的是ffff,看起来是你讲的那样哦
给你出个最好办的方法,你开机的时候拿电表去量一下a20的脚,看是高还是低。。。你这个文档叫什么,我看看
上一页
游客

返回顶部