9

当 pc 首次启动时,它开始在物理地址 0xffff0 处执行。该地址包含一条到 BIOS 的 jmp 指令。

现在对于我的问题,我总是假设物理地址映射到 RAM。如果 RAM 最初包含垃圾值,究竟是什么将 jmp 指令放在 0xffff0 中?jmp 指令是始终相同还是不同 BIOS 的指令不同?那么 0xffff0 是否从 RAM 映射到 BIOS(意味着它是“硬映射”)?

4

4 回答 4

23

顶部的 64kB 左右映射到 BIOS ROM,而不是 RAM。

于 2010-07-18T01:50:47.683 回答
7

看一下PC 启动顺序。正如 Ignacio 已经回答的那样,它“硬映射”到 BIOS 只读内存。

于 2010-07-18T01:58:11.077 回答
6

查看这份英特尔手册:

http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-vol-3a-part-1-manual.pdf

转至第 9-6 页及后续页面,均描述了 CPU 的初始启动模式。获取的第一条指令来自 ffffff00(硬连线到 ROM BIOS):

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 CS register has two parts: the visible segment selector part and the
hidden base address part. In real-address 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).

再进一步看,在图 9-3 中,是 64K 内存的位置 - 从 ffffffff 到 ffff0000,表示有 EPROM,或系统 bios,因此没有 RAM。

在此处输入图像描述

见图 8.4: http ://www.iakovlev.org/index.html?p=946

于 2012-02-20T04:39:46.157 回答
4

实际上,它比这要复杂一些。首先,在 386 之后的任何处理器上,它实际上从 fffffff0 开始(即,距离 32 位地址空间的顶部还差 16 个字节)。在处理器第一次执行远跳转指令之前,它会进行一些特殊的映射以使整个 32 位地址空间可见,即使它是在实模式下执行的。执行远跳转后,它开始“正常”实模式操作。

无论如何,在硬件方面,您通常将(闪存)ROM 映射到该位置,因此当它开始执行时,它正在执行 ROM 中的代码。虽然开始执行的并不是真正的 BIOS——它只是将真正的 BIOS 从 ROM 解压缩到 RAM 中的代码,然后将该 RAM 重新映射到 BIOS 地址范围。

于 2010-07-18T04:06:08.180 回答