阅读:3309回复:20
机器加电后的第一条指令?
我看资料说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] |
|
沙发#
发布于:2005-06-09 13:46
got it ,IA32 volume 3
系统开机,a20无论打不打开,对于cpu来讲,都是无关紧要。。。 [编辑 - 6/9/05 by sharpor] |
|
板凳#
发布于:2005-06-09 13:40
哦?既然高端选的是ffff,看起来是你讲的那样哦
给你出个最好办的方法,你开机的时候拿电表去量一下a20的脚,看是高还是低。。。你这个文档叫什么,我看看 |
|
地板#
发布于: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 手册上说的,这好像不是北桥映射吧! |
|
地下室#
发布于: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个字节处。 |
|
5楼#
发布于: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都被初始置位了? |
|
6楼#
发布于:2005-06-08 10:22
但是不打开a20,怎么能上4g取bios执行呢? 肯定要先打开a20 |
|
7楼#
发布于:2005-06-07 15:26
但是不打开a20,怎么能上4g取bios执行呢?
|
|
8楼#
发布于:2005-06-03 16:45
还有一个小小的疑问就是书上说:“打开A20地址线是为了能存取1M以上的内存,和进不进保护模式其实没有必然的联系,也就是说不打开A20也能进入保护模式,只不过这时在保护模式下就不能存取1M以上的内存了。”那么在实模式下a20是不是也和上面说的一样呢?power on后a20到底打没打开呢? 没有打开。。。要打开,可以下kbc command。。。 实模式下a20打开也访问不了1m上的内存。。。会回卷。。 但是如果先进保护模式,把访问内存的限制设到ffffffff再回实模式就可以访问 [编辑 - 6/3/05 by sharpor] |
|
9楼#
发布于:2005-06-03 15:01
还有一个小小的疑问就是书上说:“打开A20地址线是为了能存取1M以上的内存,和进不进保护模式其实没有必然的联系,也就是说不打开A20也能进入保护模式,只不过这时在保护模式下就不能存取1M以上的内存了。”那么在实模式下a20是不是也和上面说的一样呢?power on后a20到底打没打开呢?
|
|
10楼#
发布于:2005-06-03 08:56
这不是一个bug,这是为了加快寻址速度而设计的一个cache。谢谢指点。
[编辑 - 6/3/05 by wgqwdq] |
|
11楼#
发布于:2005-05-30 16:52
刚启动时cs确实是f000,EIP是0000fff0,这样符合你的想法,对于实模式下也惊奇地符合,这使我都怀疑这个BUG是不是有意为之,是天才的构想
|
|
|
12楼#
发布于:2005-05-30 16:49
[quote]tiamo就是tiamo,高,尤其是只有在你修改段寄存器得时候 你说的“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 |
|
|
13楼#
发布于:2005-05-30 16:33
tiamo就是tiamo,高,尤其是只有在你修改段寄存器得时候 你说的“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] |
|
14楼#
发布于:2005-05-30 15:51
第一个指令是fffffff0 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语句,而且你可以想象地认为真正的执行从这里开始 不知我的以上是否准确,还请大家指正 |
|
|
15楼#
发布于:2005-05-30 13:48
第一个指令是fffffff0 |
|
16楼#
发布于:2005-05-30 11:25
谢谢指点,但是到底是谁的正确呢,各位老大有没有这方面的资料啊?
|
|
17楼#
发布于:2005-05-28 22:16
第一个指令是fffffff0
intel得段寄存器有个不可见得部分 每次寻址使用得是这个不可见得部分寻址得 只有在你修改段寄存器得时候 才用真正得段寄存器得值去更新这个不可见得部分 intel得cpu在加电以后 这个不可见得值不设置了 虽然cs保持在f000虽然那还是实模式 但是这个时候得cs不可见部分跟cs真实得值是不匹配的 以上为回忆结果..或许有差别 详细信息请查阅intel文档 vol3 bios的代码是自己在运行时复制过去的 是一个从rom 到ram的复制 跟硬件提供的映射功能完全是两回事 ram就是指你的内存...不是专门的硬件 以上 |
|
18楼#
发布于:2005-05-28 11:35
bmyyyud说的对,
北桥那边有专门的硬件转换机制。 你访问的c000-ffffh可以在rom和ram中切换。。。 |
|
19楼#
发布于: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上开辟一部份空间呢? 其实机器刚加电进入的是实模式,根本看不到4G地址空间,所以第一条指令在ffff:0000处,注意这里给出的这个地址是按DOS下的段:偏移形式的,对应物理地址ffff0处,一般这里是个jmp语句 |
|
|
上一页
下一页