IOMMU地址映射

本文详细介绍了IOMMU的地址映射机制,包括legacy模式和Scalable Mode。在Scalable Mode中,通过Pasid字段支持大量独立的虚机和容器实体,采用两级页表结构,First-Stage和Second-Stage Translation用于不同场景,如Passthrough、Nested Translation等。此外,文章讨论了内核中对这两种模式的支持情况和应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文结合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】的二级映射。

PASID Table里的PASID ENTRY指向的就是【BDF+PASID】完整索引到的PASID表项。

<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值