映射寄存器

执行 DMA 的驱动程序使用三个不同的地址空间,如下图所示。

物理、逻辑和虚拟地址映射。

在任何 Windows 平台上,驱动程序可以访问处理器支持的完整虚拟地址空间。 在 32 位处理器上,虚拟地址空间表示 4 GB。 CPU 使用页表将虚拟地址空间中的地址转换为系统物理地址空间中的地址。 每个页表条目 (PTE) 将一页虚拟内存映射到物理内存页,从而在必要时执行分页操作。 MDL (内存描述符列表) 为与驱动程序 DMA 操作关联的缓冲区提供类似的映射。

设备访问系统的完整虚拟地址空间的能力各不相同。 设备使用逻辑 (设备) 地址空间中的地址。 每个 HAL 使用 映射寄存器 将设备或逻辑地址转换为物理地址, (物理 RAM) 中的某个位置。 对于设备硬件,映射寄存器执行与 MDL (和页表) 对软件 (驱动程序) 执行的相同功能:将地址转换为物理内存。

由于这些地址空间是单独寻址的,因此驱动程序无法使用虚拟地址空间中的指针来寻址物理内存中的位置,反之亦然。 驱动程序必须先将虚拟地址转换为物理地址。 同样,设备不能使用逻辑地址直接访问物理内存。 设备必须首先转换地址。

HAL 必须为不同计算机上的各种 DMA 设备和 I/O 总线设置支持 DMA 的适配器对象。 例如,大多数 ISA DMA 控制器、从属设备和总线主设备的地址线不足,无法访问 32 位处理器 (的完整 4 GB 系统物理地址空间,或者访问以 36 位 PAE 模式运行的 x86 处理器的 64 GB 系统物理地址) 。 相比之下,PCI DMA 设备通常具有足够的地址行来访问 32 位处理器中的完整系统物理地址空间。 因此,每个 HAL 提供 DMA 设备可以访问的 逻辑地址 范围与每台计算机 的物理地址 范围之间的映射。

每个适配器对象都与一个或多个映射寄存器相关联,具体取决于要传输的数据量和可用内存量。 在 DMA 传输期间,HAL 使用每个映射寄存器将设备可访问的逻辑页别名为 CPU 中物理内存页的别名。 实际上,地图寄存器为使用 DMA 的驱动程序提供散点/收集支持,无论其设备是否具有散点/收集功能。

下图演示了没有散点/收集功能的 ISA DMA 设备的驱动程序的此类物理到逻辑地址映射。

示例 isa dma 设备的地址映射。

上图显示了以下类型的映射:

  1. 每个地图寄存器将一系列物理地址 (由实线) 指向,映射到 ISA DMA 设备的虚线 (虚线) 的低序逻辑地址。

    此处,三个映射寄存器用于将系统物理内存中三页的数据范围别名为 ISA DMA 设备的三个页面大小的低序逻辑地址范围。

  2. ISA 设备使用映射的逻辑地址在 DMA 操作期间访问系统内存。

    对于类似的 PCI DMA 设备,三个映射寄存器还将用于三个页面大小的数据范围。 但是,映射的逻辑地址范围不一定与相应的物理地址范围相同,因此 PCI 设备也将使用逻辑地址访问系统内存。

  3. MDL 中的每个条目将虚拟地址空间中的位置映射到物理地址。

请注意映射寄存器与 MDL 中虚拟到物理条目之间的对应关系:

  • MDL 中的每个映射寄存器和每个虚拟条目最多映射 DMA 传输操作的完整物理数据页。

  • MDL 中的每个映射寄存器和每个虚拟条目映射的数据可能少于整页。 例如,MDL 中的初始虚拟条目可以映射到与物理页边界的偏移量,如前面的 物理、逻辑和虚拟地址映射 图所示。

  • MDL 映射中的每个映射寄存器和每个虚拟条目至少一个字节。

在请求读取或写入操作的 IRP 中,Irp-MdlAddress> 的不透明驱动程序 MDL 中的每个虚拟条目表示用户缓冲区的系统物理内存中的页边界。 同样,单个 DMA 传输所需的每个附加映射寄存器都表示设备可访问的逻辑地址范围中的一个页面边界,该范围别名为系统物理内存。

在每个 Windows 平台上,每个适配器对象都有一组关联的一个或多个映射寄存器,这些寄存器位于特定于平台的 (,不透明到驱动程序) 基址。 从驱动程序的角度来看,图中演示 示例 ISA DMA 设备地址映射 的映射寄存器基是一组映射寄存器的句柄,这些映射寄存器可以是芯片、系统 DMA 控制器或总线主适配器中的硬件寄存器,甚至可以是系统内存中 HAL 创建的虚拟寄存器。

适配器对象可用的映射寄存器数可能因不同的设备和 Windows 平台而异。 例如,HAL 可以向在某些平台上使用系统 DMA 的驱动程序提供更多的映射寄存器,而不是在其他平台上使用,因为不同 Windows 平台上的 DMA 控制器具有不同的功能。