想想 8086...BIOS 是否永久存储在内存中,还是被复制到 RAM 中?

想想 8086...BIOS 是否永久存储在内存中,还是被复制到 RAM 中?

我有一个关于 BIOS 如何加载和执行的问题。我知道 CPU 从 0xFFFF0 开始执行 BIOS,但是 BIOS 在那里是怎么回事?

BIOS 是否硬连线到 CPU 上的该地址,以便您无法覆盖它,

或者它被复制到该内存地址,就好像它只是您可以读取/写入的常规内存一样。

如果是的话,如果没有现有程序,它如何被复制到该地址?

语境:我正在为自定义 CPU 编写模拟器,我想知道 BIOS 是如何在内存中存储和加载的。

答案1

在 8088/8086 系统中,这通常是完毕通过物理映射/连接 A16-A19 线来启用(通过 74138 芯片启用/选择线)连接到 ROM 芯片启用线的正确 74138 式解码器。板上的其他 74138 芯片启用/选择线的接线方式不同,因此当 RAM 地址位于(地址)总线上时,后者被启用。在那个时代,您还有多个物理 ROM 芯片(小于 64Kb),所以这就是使用解码器的原因:A13-A15 线通常由相同的 74138 解码以从集合中选择 ROM 芯片。

下面是一个图表(来源) 类似这样的一个相当完整的内存系统(139 是同一封装中的两个 138)。我怀疑这更像是一个学术系统而非真实系统:它在图表的下半部分使用 4x16Kb ROM 芯片(27128),而图表的上半部分是 SRAM(62256 个芯片)。第一台真正的 IBM PC 使用 DRAM 作为 RAM,所以这就是为什么这更像是学术系统而非真实系统。

在此处输入图片描述


或者它被复制到该内存地址,就好像它只是您可以读取/写入的常规内存一样。

这曾经被称为“影子 RAM”,直到'386时代,我认为。(注:有些较晚的 286 芯片组也具有此功能,例如 VLSI82C202尽管一些早期的82C101显然没有。)如何做到这一点(在一个[Headland]实现中):

当系统启动时,系统 BIOS 中的例程会将 ROM 模块复制到 RAM,方法是将 BIOS 复制回自身。[...] 内存控制器以这样的方式安排读取和写入操作,即 ROM 内容复制到影子 RAM 中。[...]

其余描述有点令人困惑(对我来说),但本质上,那个时代的内存控制器似乎在初始启动/复制模式下将 ROM 地址写入重定向到 RAM。然后 BIOS 将控制器切换到“影子模式”,从该模式中,对这些地址的读取也由 RAM 提供(复制完成后)。显然,在后者/“影子”模式下,对 ROM 地址的写入被禁用/忽略(在内存控制器级别),因此 BIOS 的 RAM 副本无法在事后更改。不过,这可能更依赖于内存控制器。

控制启动与后期/“影子”模式的位位于 I/O 空间的某个位置,例如在特定控制器上,在进行自我复制之后,BIOS 例程必须执行以下操作:

在此处输入图片描述

82C202 使用类似的“自复制”技术,但写保护是独立的(当然,用于访问控制器寄存器的 I/O 端口也不同)。

需要说明的是,影子模式的工作方式与 386 [或 286] 处理器并没有什么特别之处。一切都在 [外部] 内存控制器级别。只是据我所知,早期的 IBM PC 中没有这个功能。

答案2

当然,具体细节取决于系统设计,但例如 IBM PC(其拥有更便宜但功能相似的 8088)拥有8kb ROM 芯片。正如您所建议的那样,这已硬连线到上部内存地址。因此,在重置时,CPU 将直接从 ROM 读取。写入 ROM 内存空间显然不会对 ROM 内容产生影响。

答案3

简单来说,设备的 BIOS 或固件并非物理存储在处理器中。PCB 上有一个专用芯片来存储它。固件旨在通过与 PCB 上的所有主要组件“对话”来检查和启动所有必需的测试和流程。

固件由芯片启动并载入内存 (RAM) 以供主动使用。设备上任何其他组件上的相关地址只是 BIOS 用来运行/启动启动期间需要执行的任何进程的地址。


由于您已经编辑并指定了更多信息,我认为以下现有帖子可能会帮助您更好地理解,因此我不必将其全部写出来:

答案4

BIOS 被硬件映射到内存的前 8KB,处理器从那里读取,以及 ROM 访问所需的所有相关额外等待状态。

最初的 8086 PC 没有足够的备用 RAM 来复制 ROM(最初的 RAM 总共只有 16KB),而且即使有,也没有硬件可以将 RAM 重新映射到 ROM 占用的地址空间。

我依稀记得 BIOS 大约为 8KB(我拥有的一台 IBM PC,在活页手册的背面附有 BIOS 列表 (!))。

相关内容