为什么 BIOS ROM 需要存在于 PC 的地址空间中?

为什么 BIOS ROM 需要存在于 PC 的地址空间中?

当 x86 PC 启动时,它会开始执行一个称为 BIOS 的程序,该程序存储在主板上的非易失性存储器中。BIOS 的工作是准备硬件,然后将控制权移交给操作系统。来源附录 B. 来自实验课这里在本节中PC 的物理地址空间显示以下映射。
+------------------+ <- 0x00100000 (1MB)
| BIOS ROM |
+------------------+ <- 0x000F0000 (960KB)

为什么 BIOS 需要使用它,如果不是,它有什么用处?它与我在开头提到的存储在主板非易失性存储器中的 BIOS 程序有何关系?虽然在实验室资源中提到设计是针对 qemu(x86 模拟器),但 osdev [http://wiki.osdev.org/Memory_Map_%28x86%29#ROM_Area]关于内存布局也说了同样的话。我只是有点困惑。

答案1

DOS 和其他實模式操作系统大量使用 BIOS 服务。由于 x86 处理器的实模式绑定到 2^20 = 1Mb 地址空间,i8086 系统的供应商决定必须将 BIOS 映射到地址空间的高端(就像现在高半内核将其虚拟内存映射到范围的末尾):从 0xA0000 及更高。

保护模式使这块保留的内存成为地址空间中的空白:保护模式程序无法在没有重大黑客攻击的情况下从 BIOS 调用函数,导致它在保护模式和长模式下无法使用(每个现代操作系统都以这种模式运行),但将软件从 RM 传输到 PM 并不快,因此英特尔工程师留下了一个逃生舱,即 v8086 模式,它允许在保护模式环境内的沙箱中运行旧的实模式程序(例如,OS/2 大量使用 v8086 模式,Windows 系统中的 DOS 模拟也依赖于此功能),仍然需要 BIOS 服务来实现兼容性。

在保护模式下,此内存仍用于某些任务,例如 VGA 终端/图形输出(终端的内存位于 0xB8000,控制台字体也可以在那里调整,VGA 图形帧缓冲区位于 0xA8000,如果我没记错的话)。有时,此内存甚至用于以下 API:3 版但是,是的,BIOS 映射在 0xA0000 主要是向后兼容的问题。有人试图取代它:对 BIOS 的现代重新思考,UEFI 现在正在稳步普及。

结论:BIOS 映射在 0xA0000 处主要是为了向后兼容并且正在努力用 UEFI 等更现代的启动环境取代它。

答案2

据我所知,这主要是历史原因。程序存储在芯片上,但要运行它,代码会加载到 RAM(BIOS 影子)中,CPU 可以直接从中获取指令。这对于容量最小的廉价芯片上的压缩 BIOS 映像尤其必要。

禁用“BIOS 影子”选项可能会减慢启动过程,或者很少会导致更严重的问题。此外,MS DOS 等操作系统确实会额外使用 BIOS 例程进行 IO,这是一种 HAL。在当今的多线程操作系统中,这会非常缓慢且不安全,因此在将控制权移交给操作系统后,该 RAM 仍处于非活动状态。

其他系统甚至将其内核放在该芯片上,例如 Commodore Amiga Kickstart,也可以作为软盘使用。

相关内容