内存如何映射到某些硬件?MMIO究竟是如何实现的?

Din*_*awz 10 memory

意识到我不是在问 MMIO(内存映射输入/输出)是如何设置的,而是问它是如何映射的,即它究竟是什么映射的?不是什么映射到什么,我可以谷歌一个内存映射。

我想知道的是,例如,一旦您第一次打开计算机电源,究竟是什么“映射”了内存,或者它是如何工作的?

基本上,是什么为某些目的设置内存或“映射”它?

我最初以为它是引导固件,如 BIOS 或 EFI/UEFI,但另一个站点上的另一个用户告诉我它与内存控制器有关。真的吗?

但是如何,如果更详细,如果不是太多要问?非常感谢任何澄清!

Dav*_*rtz 12

有几个步骤。首先,BIOS 会发现系统上的所有设备。然后它询问每个设备以决定 BIOS 是否会设置该设备,如果是,则确定设备需要多少内存地址空间(如果有)。然后 BIOS 通过写入其 BAR(基地址寄存器)为每个设备和程序的地址解码器分配空间。

总之,BIOS:

  1. 发现设备的 BAR(基址寄存器)。每个设备最多可以有六个 BAR。

  2. 对于每个 BAR,询问 BAR 它需要多少地址空间。

  3. 为 BAR 分配一块地址空间。

  4. 使用所选内存地址空间块的基地址对 BAR 进行编程。

设备的地址解码器现在响应该地址空间块内的读取和写入。从那时起,当 CPU(或系统中具有 DMA 功能的任何设备)读取或写入该范围内的任何地址时,设备将响应请求。

请注意,没有为设备分配内存。内存设备上。它是分配给设备的内存地址空间。

当然,您可以在 Wikipedia 的PCI 配置空间页面上找到详细的过程。

  • 这是一个以 PC 为中心的答案,仅描述 PCI 如何为卡设置内存映射。PCI 是用于“即插即用”卡的总线,设计为可自我配置。更常见的是,在设计主板或 SBC 或 SoC 时,设备会被分配地址,然后硬连线(或编程到 FPGA)到地址解码器中。集成设备根本不需要像 PCI 卡那样动态分配它们的地址。 (2认同)

归档时间:

查看次数:

12605 次

最近记录:

5 年 前