1. MODULE_IMPORT_NS
当LINUX_KERNEL_CODE >= KERNEL_VERSION(5,4,0), linux引入了namespace来控制内核中symbol引用范围。
比如跟USB Storage相关的一些函数,我们可以直接使用EXPORT_SYMBOL,使所有模块可以可用,也可以EXPORT_SYMBOL_NS(symbol_name, USB_STORAGE), 这样只有使用了MODULE_IMPORT_NS(USB_STORAGE),导入USB_STORAGE namespace后,才能引用symbol_name.
使用Namespace可以更好地管理symbols,更容易分辨kernel各部分的依赖关系,而且明确的导入某个模块的symbol,也在一定程度上增加了kernel的安全性和稳定性。
2.IOMMU
获取dev所属的iommu domain, 可以通过函数
struct iommu_domain *iommu_get_domain_for_dev(struct device *dev)
得到。 什么是iommu domain, 它有什么用呢?
iommu domain是IOMMU用于将设备在逻辑上进行分组,以管理和隔离不同组设备的内存访问。 属于同一个domain的设备,它们使用同一个地址空间。这个地址空间或者说domain的地址称为IOVA(device-visible virtual addresses). 它们由IOMMU映射到物理内存.
对于PCIE设备而言(Intel架构,所有的设备都属于PCIE设备), 每个域维持了一个元素位root entry的表,每一项root entry代表一个PCIE的总线. root entry 又有一个context entry的表, context entry的每一项代表一个PCIE device的function. 因此root entry 和 context entry 合在一起,就可以唯一指定一个pcie 设备function. 即设备的bdf. context entry指向地址转换表, 将当前域地址,转为物理地址.