我正在研究 PCIe 中添加的 ATS 功能。我遇到了未转换地址和物理地址等术语。本质上,主机上的转换代理会将从设备收到的未转换地址转换为主机的物理地址。
但我的疑问是,主机驱动程序总是向设备提供物理地址,那么谁真正向设备提供这个未转换的地址(虚拟地址)?
例如:在“nvme”的情况下,nvme 驱动程序在为命令准备 PRP 时,从主机内存中获取物理地址(而不是虚拟地址)并在提交队列中提交该命令。
那么谁真正向设备发送虚拟地址?
答案1
ATS 可用于直接分配设备,将硬件设备分配给虚拟机。在这种情况下,VM 驱动程序可以使用客户机物理地址作为未转换地址,平台 IOMMU 将其转换为主机物理地址,并根据设备的请求者 ID 选择转换表。
使用 PCIe PASID 扩展,未转换地址还可以包含进程地址空间 ID (PASID)。IOMMU 可以在选择转换表时考虑此 ID。例如,这可用于将设备分配给进程,并让进程与设备一起使用 IO 虚拟地址。