Linux arm64 IOMMU总结

一、DMA的引入

Non-DMA:CPU直接与设备进行数据交互,CPU的负载会随着数据的读写而增加;
DMA:CPU不参与数据的直接传输,DMA Controller负责Device与Memory之间的数据搬运,并以中断信号的形式通知CPU;
可以看出,DMA可以提高CPU的使用率。

二、IOMMU与DMA的关系

可以看出,IOMMU是DMA过程中的一环,也是实现DMA的一种手段。(当然DMA也可以不走IOMMU,但是有的安全隐患)

三、IOMMU的作用

1、IOMMU是设备访问物理地址的媒介, IOMMU使得设备无法直接访问物理地址,大大增加了设备进行DMA攻击的难度。(安全性)

2、部分设备的引脚数较少,导致其位数较低,无法寻址到整个物理内存空间。(成本原因?越多引脚意味着更大的寻址范围(越多的bit位))

以目前主流的32位设备为例,其在物理内存中直接寻址的范围是[0, 4GB)。但是,现代操作系统的内存往往大于4GB。如果设备申请DMA时,内核为设备分配的DMA buffer的地址高于4GB(以下简称为“high

### 启用IOMMULinux系统的配置指导 #### 修改GRUB引导加载程序设置 为了使内核支持IOMMU,在启动参数中加入特定选项是必要的。对于Intel CPU而言,应当编辑`/etc/default/grub`文件中的`GRUB_CMDLINE_LINUX_DEFAULT="..."`这一行并添加如下所示的内容[^1]: ```bash intel_iommu=on ``` 完成上述修改之后,更新grub配置使得更改生效。 #### 编辑设备树节点(针对ARM架构) 如果是在基于ARM架构的平台上,则可能涉及到调整设备树源(DTS)文件来确保硬件能够正确初始化其IOMMU功能。不过此部分不在当前讨论范围内,因为提供的参考资料并未涉及相关内容。 #### 使用Polkit或Sudo执行脚本作为root权限 由于某些情况下需要绕过IOMMU组(ACS覆盖补丁),这通常意味着要运行一些特殊命令或者脚本来实现目的。考虑到这些操作往往要求较高的权限级别,可以考虑利用Polkit或是通过sudoers文件配置的方式让指定的应用能够在不输入密码的情况下获得超级用户的权利去执行相应动作[^3]。 #### 绑定PCIe设备至UIO驱动器实例 当准备就绪后,可以通过DPDK工具包里的devbind.py脚本来把具体的网卡或其他类型的PCI Express设备绑定到通用用户空间IO(`uio_pci_generic`)驱动之上。下面给出了一条用于将名为eth1位于总线地址04:00.1处的网络接口控制器(NIC)切换成由该驱动接管的例子[^4]: ```bash ./usertools/dpdk-devbind.py --bind=uio_pci_generic 04:00.1 ``` 以上就是关于如何在Linux操作系统里开启IOMMU特性的基本介绍以及相关联的操作示范。需要注意的是实际部署过程中还需参照具体发行版文档来进行更细致化的设定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值