本文结合vt-directed-io-spec和内核的实现,对IOMMU的地址映射机制有了基础的认识,在此记录。最开始的原因是之前看ATS时对于first-stage和second-stage的困惑,因为近几年引入了pasid模式,IOMMU的映射机制也看起来复杂了很多,所以对整个映射机制进行了梳理。
一、基础知识
非pasid机制下,传统的IOMMU根据BDF号索引到设备页表的基地址,然后根据设备页表找到HPA,完成一次translation,这称为legacy模式。legacy模式的经典映射流程大家比较熟悉。
Scalable-iov引入了新的模式称为scalable模式,与legacy模式相对应。scalable-iov的目的也是针对虚机和容器场景,在SR-IOV的基础上进一步扩展了可供主机使用的安全隔离实体的数量。SRIOV是在PF的基础上扩展了VF,每个VF还是有独立的BDF号。而scalable-iov直接修改了TLP报文的格式,TLP报文中增加了pasid字段(最多20位),所以同一个BDF号,可以使用不同的pasid字段区分。对于主机而言,一个PCIE设备,可以分出多达2^20个独立的实体给虚机和容器使用。显然,scalable模式依赖设备侧和主机侧RC硬件的同步支持。
scalable模式的映射机制如下图。
legacy模式里根据BDF号的映射还是在的,也就是说首先会根据BDF号索引,只是BDF号索引到的并非是页表基地址,而是scalable mode pasid directory的基地址。
由于最多支持65536个pasid,从节省空间的角度考虑,这个pasid表也做成了两级,第一级称为pasid目录,负责PASID【19:6】的一级映射;第二级称为pasid table,负责PASID【5:0】的二级映射。文章来源:https://www.toymoban.com/news/detail-695965.html
PASID Table里的PASID ENTRY指向的就是【BDF+PASID】完整索引到的PASID表项。文章来源地址https://www.toymoban.com/news/detail-695965.html
到了这里,关于IOMMU地址映射的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!