在x86体系架构中,主机CPU访问PCIe设备内存空间和PCIe设备访问主机内存空间的过程涉及多个层次的地址映射和转换。以下是详细的解释:
主机CPU访问PCIe设备内存空间
1. CPU生成虚拟地址(Virtual Address, VA):
- 在x86架构中,应用程序或操作系统通过虚拟地址访问内存。
2. 虚拟地址到物理地址的转换(VA -> PA):
- 通过内存管理单元(MMU),使用页表(Page Table)将虚拟地址转换为物理地址(Physical Address, PA)。
- 这一步涉及页表查找,可能会涉及多级页表。
3. 物理地址到PCIe地址的转换(PA -> PCIe Address):
- 操作系统或BIOS在初始化时,通过配置PCIe设备的Base Address Registers (BARs) 来映射设备内存到主机的物理地址空间。
- 物理地址空间的一部分被保留用于PCIe设备的内存映射I/O(MMIO)。
- 当CPU生成的物理地址在这些保留范围内时,地址会被映射到相应的PCIe设备。
4. PCIe总线传输:
- 转换后的地址通过PCIe控制器发送到PCIe总线。
- PCIe控制器根据地址范围将请求路由到正确的PCIe设备。
PCIe设备访问主机内存空间
1. PCIe设备生成地址请求:
- PCIe设备通过DMA(Direct Memory Access)来访问主机内存。设备生成一个目标地址,该地址是主机内存的物理地址。
2. PCIe地址到物理地址的转换(PCIe Address -> PA):
- 设备生成的地址是目标主机内存的物理地址,不需要进一步转换。
- 设备直接通过PCIe总线发送地址和数据传输请求。
3. 物理地址到虚拟地址的转换(PA -> VA):
- 主机的DMA控制器或IOMMU(Input-Output Memory Management Unit)负责将设备请求的物理地址转换为合适的虚拟地址(如果需要)。
- 使用IOMMU时,设备生成的地址可能是设备虚拟地址(Device Virtual Address, DVA),IOMMU将其转换为主机的物理地址。
4. 内存访问:
- 转换完成后,数据被直接传输到主机内存的物理地址空间中。
地址映射和转换总结
- 主机CPU到PCIe设备:
- 虚拟地址(VA) -> 物理地址(PA):通过MMU和页表转换。
- 物理地址(PA) -> PCIe地址:通过PCIe BARs映射。
- 通过PCIe总线传输到设备。
- PCIe设备到主机内存:
- 设备生成PCIe地址(通常是主机物理地址)。
- 直接通过PCIe总线传输。
- 可选:通过IOMMU进行地址转换(设备地址 -> 物理地址)。
- 访问主机内存。
这种双向通信机制使得主机CPU和PCIe设备能够高效地共享内存资源,实现高速数据传输和处理。