Electronic Joint Business

Solution for E-Business

ROM

X86/X64 架构的系统地址表初始化 (1):PCI 总线系统

去年我在《信息安全杂志》上发表了“恶意的 PCI 扩展 ROM”一文,文中并未对 PCI 扩展 ROM 1的地址映射展开讨论,这篇文章2在此作出补充。系统程序员常对设备内存(如 PCI 设备内存)是如何映射到系统地址空间感到疑惑不已。本文详细论述了系统地址表的初始化过程,尤其是那些控制着设备内存映射到系统地址表的 PCI 芯片寄存器的初始化。注意:只有带内存的 PCI 设备才有地址映射的要求,比如显卡、带有板载缓冲区或支持 PCI 扩展 ROM 的网卡等。

由于 X86/X64 架构的总线协议必须保持向后兼容,因此其系统地址表十分复杂。系统所使用的总线协议规定了总线设备的内存到系统地址表的地址映射关系。因此,要了解系统地址表的初始化,就必须了解特定的总线协议的地址映射机制。本文重点关注基于 PCI 总线协议的系统。以当今的的标准来衡量,PCI 总线协议略显老旧了。但是,弄清楚它在软件/固件的最底层中所起到的作用仍非常重要。不了解 PCI 总线协议,就无法理解后续的 PCI Express (PCIe) 总线协议。而 PCIe 现在基本成为 X86/X64 系统的主流总线协议。 本系列文章的第 2 部分将讨论基于 PCIe 的系统。

约定
本文常常可见“内存”或“存储器”这个词,且含义不尽相同。为了避免困惑,本文约定如下:

  • “主存储器” 或者 “主存” 指的是安装在主板上的 RAM 模块。
  • “内存控制器” 指的是 CPU 或者芯片组中用以控制和存取 RAM 模块的部分
  • “可刷新存储器” 指的是主板上存储 BIOS/UEFI 的芯片或者存储 PCI 扩展 ROM 内容的芯片。
  • “内存范围” 或 “内存地址范围” 指的是设备在 CPU 内存空间所占用的范围,即从基地址(起始地址)到结束地址的范围(基地址+内存大小)
  • “内存空间”指的是 CPU 所能访问的内存地址集,即 CPU 所能寻址的内存。这里的内存包括 RAM、ROM 以及其它 CPU 所能寻址的存储器。
  • “PCI 扩展 ROM” 除非另有定义,否则指的是 PCI 设备上的 ROM 芯片。

启动过程概述
本节将详细解释系统启动过程,这有助于后续了解系统地址表及其它与总线协议相关的内容。在涉及这些内容之前,你需要对启动过程有清晰的认识。

X86/X64 的启动从执行平台固件(BIOS/UEFI)开始。执行平台固定比启动操作系统要早,甚至是在 “启动加载器” 加载并执行操作系统之前。平台固件的执行过程可以简单概括如下:

>>> 阅读全文

 

, ,