IOMMU配置过程

AMD IOMMU与Linux (2) -- IVRS及AMD IOMMU硬件初始化 1. I/O Virtualization ACPI table [1] IVRS (I/O Virtualization Reporting Struct) -> 48-byte header -> IVDB:IVHD (I/O Virtualizaiton Hardware Definition) -- info about IOMMU and devices Types 10h, 11h, 40h ... 阅读详情
AI摘要

本文基于Linux 5.4.233内核源码,深度分析IOMMU配置过程。介绍了函数定义、参数及实现流程,包括参数校验、页表粒度计算等。还分析了AMD IOMMU映射操作,涉及关键数据结构、映射流程及安全性能优化。此外,对update_domain函数和protection_domain结构进行了解析。

Linux 5.4.233 内核中 iommu_map 函数实现深度分析

iommu_map 是 Linux 内核中用于建立 IOVA(I/O 虚拟地址)到物理地址映射 的核心函数,其实现涉及 IOMMU 硬件操作、页表管理和内存保护机制。以下基于 5.4.233 内核源码进行详细解析:


1. 函数定义与参数

函数位于 drivers/iommu/iommu.c:

int iommu_map(struct iommu_domain *domain, unsigned long iova,
              phys_addr_t paddr, size_t size, int prot)
  • domain:IOMMU 域,包含硬件特定的页表信息。
  • iova:设备使用的虚拟地址起始位置。
  • paddr:物理地址起始位置。
  • size:映射的内存区域大小。
  • prot:保护标志(如 IOMMU_READ、IOMMU_WRITE)。

2. 实现流程分析

(1) 参数合法性校验
if (!domain || !domain->ops->map)
    return -EINVAL;

if (size & ~PAGE_MASK)
    return -EINVAL; // 检查 size 是否页对齐
  • 确保 domain 有效且支持映射操作。
  • 映射大小必须是页对齐的(4KB/2MB/1GB)。
(2) 计算页表粒度和映射次数
size_t mapped = 0;
while (mapped < size) {
   
   
    // 尝试以最大支持的页大小(如 1GB)进行映射
    size_t pgsize = iommu_pgsize(domain, paddr, iova, size - mapped);
    // 调用具体 IOMMU 驱动的 map 方法
    ret = domain->ops->map(domain, iova + mapped, paddr + mapped,
                           pgsize, prot);
    if (ret)
        break;
    mapped += pgsize;
}
  • 页粒度选择:通过 iommu_pgsize() 选择当前硬件支持的最大页大小(优化页表项数量)。
  • 循环映射:若映射失败(如部分区域已被占用),则尝试更小的页粒度。
(3) 底层驱动映射操作

以 Intel IOMMU (VT-d) 为例(drivers/iommu/intel-iommu.c):

static int intel_iommu_map(...) {
   
   
    // 获取页表地址
    struct dmar_domain *dmar_domain = to_dmar_domain(domain);
    // 操作页表项
    return __domain_mapping(dmar_domain, iova, paddr, size, prot);
}
  • 页表遍历:通过多级页表(如 4 级页表)查找或创建对应的页表项。
  • 更新页表项:将 iova 映射到 paddr,并设置权限位(读/写/缓存等)。
(4) 错误处理与回滚

        
qcom camera smmu 学习(3) iommu_dma_alloc_iova 已经成功获取到了虚拟地址,iommu_map_sg 将把虚拟地址和物理散列表中的物理地址进行映射。 iommu_map_sg 在4.19 以后的内核这个接口已经删除了 size_t iommu_map_sg(struct iommu_domain *domain, unsigned long iova, struct scatterlist *sg, unsigned in... 阅读详情

相关推荐

AMD IOMMU与Linux (3) -- DMA

两处会设置struct iommu_ops amd_iommu_ops; 一处在struct iommu_device的iommu ops; 另一处在struct bus_type的iommu ops; amd_iommu_init -> iommu_go_to_state -> state_next -> amd_iommu_init_pci -> ...

2517

Linux之arm SMMUv3 控制器注册过程分析(7)

Linux之arm SMMUv3控制器初始化及设备树分析(6)-优快云博客中描述了IOMMU控制器初始化过程。SMMU驱动最后调用iommu_device_register将其注册到内核中,下面分析一下SMMU控制器注册过程中都做了那些工作。遍历内核中所有总线,初始化使用SMMU的设备,主要是创建设备的Stream Table,给设备分配或者创建iommu_group。遍历所有使用SMMU的设备,创建iommu_domian,并和设备关联起来。主要是初始化设备使用的STE和CD表。

z20230508的博客 721

使用 IOMMU 技术的单片机 Linux 实现

通过使用 IOMMU 技术,可以提高设备驱动的稳定性和安全性,同时也能够提高系统性能。IOMMU 技术是一种硬件机制,用于在主机和设备之间建立映射关系,实现虚拟地址到物理地址的转换。在单片机系统中,我们需要建立 IOMMU 地址映射表,该表记录了虚拟地址和物理地址之间的映射关系。本文将介绍如何在单片机上实现 IOMMU 技术,以及如何在 Linux 操作系统中调用这些 IOMMU 功能。该函数会查找在地址映射表中是否有该虚拟地址的映射关系,如果有,则返回对应的物理地址,否则返回错误。

server_api196的博客 249

QGIS实用功能:加载天地图与下载指定区域遥感影像

本文聚焦 QGIS 软件实用功能,详细介绍在 QGIS 中加载天地图及其他常用底图(如 Google Maps、Bing Maps)的完整流程,涵盖天地图插件安装、密钥获取与配置、插件拓展使用等操作。同时,以 上海市瑞金二路街道为例,分步讲解下载指定区域遥感影像的方法,包括图层选择、坐标系设置、分辨率调整等关键参数配置。此外,还介绍了影像精准裁剪技巧,为 GIS 数据获取与处理提供实用指导,助力用户高效使用 QGIS 开展地理信息相关工作。

weixin_43679228的博客 7440

Sony SLVS-EC接口实战:如何用Xilinx K7 FPGA接收IMX421传感器数据(附电气特性匹配技巧)

本文详细介绍了在Xilinx Kintex-7 FPGA平台上实现Sony IMX421图像传感器SLVS-EC接口数据接收的完整实战方案。内容涵盖从硬件选型、PCB布局的电气特性匹配技巧,到FPGA内部GTX收发器配置、多通道绑定以及SLVS-EC协议数据解析与图像重组的关键步骤,为高速视觉系统开发提供了宝贵的调试经验和系统集成指导。

efc12345678的博客 264

百度智能云ASR实战:5分钟搞定Unity语音转文字(含完整代码)

本文详细介绍了如何在Unity中集成百度智能云ASR服务,实现高效的语音转文字功能。从环境配置、音频处理到服务端通信,提供完整代码示例和实战优化技巧,帮助开发者快速实现语音交互功能,适用于游戏开发、XR应用等场景。

ujm56789012的博客 215

【8】mctp & pldm

异步会check seq,保证不丢包,虽然发一条req,不用等,但是不能发下一条req,等上条response回来后才能发下一条。TO(tag owner)=1是request,TO=0是response,但是异步通信response由0改为1。如下还有kcs,i3c,serial等。

持续更新ing... 1082

RPA与旅游与酒店行业自动化实战案例

1. 背景介绍 1.1 旅游与酒店行业的挑战 旅游与酒店行业是一个高度竞争的市场,企业需要不断提高服务质量、降低成本、提高效率以保持竞争力。在这个过程中,企业面临着诸多挑战,如客户需求多样化、市场变化快速、人力资源成本高昂等。为了应对这些挑战,企业需要寻求新的技术手段来提高运营效率。

AI天才研究院 615

Open3D 计算点云法向量的夹角【2026最新版】

计算法向量的夹角,博客长期更新,本文最新更新时间为:2026年3月7日。

点云侠的博客 3131

【OpenClaw从入门到精通】第10篇:OpenClaw生产环境部署全攻略:性能优化+安全加固+监控运维(2026实测版)

本文聚焦OpenClaw从测试环境走向生产环境的核心痛点,围绕“性能优化、安全加固、监控运维”三大维度展开实操讲解。先明确生产环境硬件/系统选型标准,再通过硬件层资源管控、模型调度策略、缓存优化等手段提升响应速度(实测响应效率提升50%+);接着从网络、权限、数据三层构建安全防护体系,集成火山引擎安全方案拦截高危操作;最后落地TenacitOS可视化监控与Prometheus告警体系,配套完整故障排查清单和虚拟实战案例。全文所有配置、代码均经实测验证,兼顾新手入门实操性和进阶读者的生产级部署需求。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 3409

YOLOv8与Swin Transformer的完美结合:如何提升目标检测的精度与速度

Swin Transformer(Shifted Window Transformer)是一种新型的视觉Transformer架构,采用了局部窗口(Window)和局部窗口偏移(Shifted Window)的策略,极大减少了计算复杂度,同时保持了全局感知能力。局部窗口注意力:每个窗口内的元素进行自注意力计算,减少计算量。窗口偏移:通过在不同层次引入窗口偏移,增强了全局信息的交互。层级设计:通过堆叠多个层次的模块,逐渐捕捉不同尺度的特征。

shrgegrb的博客 2151

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

上一篇: linux内核中关于ip分组代码分析逻辑--基于5.4
下一篇: vfio-pci 驱动代码分析
inquisiter
博客等级 码龄10年 374粉丝 228原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值