Intel的vt-d specification:http://download.intel.com/technology/computing/vptech/Intel(r)_VT_for_Direct_IO.pdf
下面这个关于IOMMU的讲解还挺好懂:
from:http://bbs.chinaunix.net/thread-2072818-1-1.html
在没有IOMMU的情况下,设备(指32bit或64bit设备,老的16bit的不提)的DMA操作可以访问整个物理地址空间,所以理论上设备可以向操作系统的代码段、数据段等内存区域做DMA,从而破坏整个系统。当然,通常来说不会有这样的设备。IOMMU的出现,可以实现地址空间上的隔离,使设备只能访问规定的内存区域。下面简要说一下intel的IOMMU怎么做到这点的:
目前PC架构最多有256PCI总线,于是IOMMU用一个称为root entry的数据结构描述PCI总线,总共256个root entry构成一张表。每条PCI总线最多允许256个设备,IOMMU用context entry描述一个PCI设备(或者是PCI桥),256个context entry构成一张表。所以就有了如图的关系。我们知道,PCI设备用 {BUS:DEV:FUNC}(当然,还有个segment,不过似乎PC架构都只有一个segment,这个暂时忽略)描述一个设备。所以对于一个特定设备,用bus号做索引root entry表,用dev号索引context entry表可以找到描述该设备的的context entry。context entry中有一个指针指向一章I/O页表,当设备发起DMA操作时,IOMMU会根据该页表把设备的DMA地址转换成该设备可以访问内存区域的地址。
所以只要为设备建一张I/O页表,就可以使设备只能访问规定的内存区域了。当然,也可以把该页表当成跳板,让只能寻址32bit地址空间的设备访问到64bit地址空间中去
百度文库上的一个PPT,应该是specification的一个简介:http://wenku.baidu.com/link?url=ZGUa8vIe6YWkzypQGFlr_s6kRwn2ZHZHqO3IwCJk40_OJqiGSXLK5pRiWJSzBMxKVpBo5Z1JRZXZlDJ8DiOSGN4xrev7lse_tApa20gP8CO
NOVA中的intel vt-d技术: