LWN:更加动态的swiotlb!

Linux内核SWIOTLB内存分配器详解:从memblock到slab管理的完整流程 本文深入解析Linux内核中SWIOTLB内存分配器的实现原理与工作流程,从memblock预留到slab管理的全链路细节。针对x86-64架构下32位DMA设备的寻址限制,SWIOTLB通过低地址"跳板"内存实现地址转换,确保硬件兼容性。文章详细剖析了其核心数据结构、启动阶段的内存分配机制以及2KB粒度slab管理的设计考量,为开发者提供性能优化与调试实践指导。 阅读详情

关注了就能看到更多这么棒的文章哦~

A more dynamic software I/O TLB

By Jonathan Corbet
August 24, 2023
ChatGPT assisted translation
https://lwn.net/Articles/940973/

内核的软件 I/O 转换后备缓冲区("swiotlb", software I/O translation lookaside buffer)是 DMA 支持相关实现的一个隐蔽角落。最初引入 swiotlb 是为了使一些有特殊限制的设备能够进行 DMA,人们本可以预期随着新型外设的出现,它会逐渐消失。然而,swiotlb 已经被证明在其原始使用场景之外也非常有用。Petr Tesarik 的这组 patch 现在就在更新 swiotlb 功能以便将其继续无限期地使用下去。

任何具备合理功能的 I/O 设备的基本特征之一就是要能执行 DMA,可以直接访问主内存中的数据而无需通过 CPU。没有 DMA 的话,I/O 性能将严重受限。但是,有些设备比其他设备更适合 DMA。旧的 PC 级硬件设备就可以看出这个体系结构的历史,其中通常限制了 DMA 传输使用 24 位地址空间,这意味着它们只能访问系统中最低区域的 16MB 内存。这在早期来说是足够了,但随着内存容量的增长,很快这就变成了一个限制。另一个常见的问题是 32 位限制,也导致了只能访问低 4GB 内存。

内核具有一个更加通用的功能,希望尽可能地把任何设备都能支持起来。因此比如说在处理具有寻址限制的设备时,内核将尽力在设备可以访问到的范围内分配内存。然而有时这是无法做到的。例如无法在设备访问区域内分配出大块连续内存。但更常见的情况是要传输的数据没有考虑设备的限制。例如,用户空间的 buffer 和内核的 page cache 就不是仅限于低内存区域的,它们有可能被分配给具有地址限制的设备,这该怎么办。

在这种情况下的解决方案是使用“弹跳缓冲区(bounce buffer)”。内核维护了一些低地址内存用来支持 DMA 操作。在有需要时就将分配一部分内存供设备用于 I/O。内核会根据需要将数据从实际 buffer 复制到弹跳缓冲区里(用于写操作,发生在进行写入操作之前)或从弹跳缓冲区复制到实际 buffer(用于读操作,是在操作之后)。弹跳缓冲区会拖慢一些速度,但这总比无法执行 I/O 要好。

管理弹跳缓冲区的内存,就是 swiotlb 的工作了。这个小规模的子系统曾经可能被期望随着时间的推移就可以移除了。随着新型设备替代旧型设备,寻址限制应该会消失才对。对于寻址限制没有消失的情况,也有越来越多地设备使用了 I/O 内存管理单元(IOMMU),可以为设备提供了一个单独的地址空间,从而将缓冲区映射进去,来解决问题。无论采用哪种方式,内核都不应再通过 CPU 进行 I/O 数据的搬移动作。

然而,正如 Tesarik 在 swiotlb 这组 patch 的封面信中指出的那样,事情并没有完全按照人们的期望发展。硬件供应商继续推出一些系统(特别是在嵌入式领域),都使用了比其内置设备可以寻址的空间更多的内存。还出现了其他一些用例,其中一个就是机密计算(confidential-computing)应用,其中系统运行所使用的是加密的内存,外设就无法访问该内存。机密计算系统最终可能会对其所有 I/O 都使用弹跳缓冲区,不管使用的设备是否有寻址限制。

因此,看起来 swiotlb 将会在一段时间内继续保留下来,这就有必要修复其中一些限制了。默认情况下,swiotlb 在系统引导时分配 64MB 的内存;可以使用 swiotlb= 这个命令行参数来调整这个行为。这种分配区域故意设置得非常小,希望不要占用太多内存,同时希望能满足系统的少数的(希望如此)弹跳缓冲需求就好。但是,对于某些内存非常少的嵌入式系统来说,64MB 可能也已经太大了,而对于需要大量 I/O 进行弹跳缓冲的系统来说,这个数字又太小了。换句话说,swiotlb 需要变得更加动态可配才好。

具有寻址限制的设备通常也无法执行 scatter/gatter I/O,也就是说它们需要看起来是一个单一的、物理连续的 buffer。因此,swiotlb 必须能够分配物理连续的内存,这通常会随着系统运行一段时间之后内存变得碎片化而变得更加困难;这是为什么 swiotlb 内存要在引导过程的早期来进行分配的原因之一。然而,动态 swiotlb 将不得不需要在系统运行的任何阶段来随时分配内存。

好消息是,随着时间的推移,分配物理连续内存块变得更容易了。将可移动(movable)和可回收(reclaimable)的分配区域隔离开的工作使得内存整理(memory compaction)更加有效;这有助于分配 huge page 以及其他大型的、连续的内存范围,弹跳缓冲区就是其一。内核的连续内存分配器(CMA, contiguous memory allocator)在这方面也很有帮助。因此,期望可以在系统的运行过程中的任何时候分配弹跳缓冲区的内存已经是一个合理需求了。

应用了动态 swiotlb 的补丁的系统将在最开始时都先分配相同大小的内存,尽管用户可能希望将其减小。每当无法满足弹跳缓冲区的请求时,swiotlb 就会分配更多的内存。然而,这里情况会变得有点复杂;可能会在诸如中断处理程序之类的上下文中来进行弹跳缓冲区的分配,这些上下文是不能阻塞的。因此,swiotlb 不能在此时来创建个新的内存池来满足未来的一些请求。相反,必须要直接从内存管理子系统来分配出所需的空间,并通过 workqueue 来启动一个函数,在那种限制更加少的上下文中执行较大 size 的分配。

当 swiotlb 的内存池用完时,分配的“临时(transient)”缓冲区将在取消映射(unmap)后就还给系统。然而,常规内存池将永远保留下来;在内存池增大时,它也会保持较大值。这个策略可能是合理的;需要一定量的弹跳缓冲区的设备可能在未来也会继续需要这些缓冲区。与此同时,整个 swiotlb 可能会保持足够小,以至于保留的这些内存不应该成为一个问题。不过,未来很可能会看到 swiotlb 添加某种收缩(shrinker)机制。

这组补丁已经经历了七次修订,开发人员似乎多数人对它都感到满意。Christoph Hellwig 已经合入了这组 patch,预计将在 6.6 合并窗口期间推送到 mainline。当然,像其他内核项目一样,这里的工作永远不会真正完成;Tesarik 已经透露,正在开发后续的 patch。

全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~

format,png

没有IOMMU的DMA操作-swiotlb(转) 因为DMA受32位访问的限制,所以只能访问0x0000_0000到0xFFFF_FFFF地址空间的内存,再加上DMA需要访问连续的物理内存,故coherent pool,cma,buddy,swiotlb必须保证在0x0000_0000~0xFFFF_FFFF以内的连续物理空间。我们知道DMA映射有两种方式,一种是一致性映射 dma_alloc_coherent,一种是流式映射 dma_map_single (dma_map_sg可以映射多个dma buffer)。 阅读详情

相关推荐

dma-swiotlb.rar_swiotlb

Contains routines needed to support swiotlb for ppc.

Linux x86-64 IOMMU详解(二)——SWIOTLB(软件IOMMU)

SWIOTLB概述 上一篇文章已经提到,IOMMU的核心功能就是,实现在low buffer和high buffer之间的sync,也就是内存内容的复制操作。 读者可能会想,内存的复制,在内核中,不就是调用memcpy()函数来实现的吗?没错,这就是本文要介绍的IOMMU的软件实现方式——SWIOTLB。之所以说是软件实现,是因为sync操作在底层正是调用memcpy()函数,这完全是软件实现的。......

qq_34719392的博客 1万+

UVM概述及uvm_component和uvm_object(一)

UVM:Universal Verification Methodology(通用验证方法学) UVM:是建立在systemverilog平台上的一个库,提供了一系列的接口,让我们能够更方便的进行验证。验证平台组成: Driver:用来把不同的激励施加给DUT; Monitor:用来检测DUT的输出; Scoreboard:专门用来比较期望值与monitor检测到的DUT输出; Refer

南国之邱 1万+

Linux swiotlb技术解析

概述 swiotlb技术是一种纯软件的地址映射技术,主要为寻址能力受限的DMA提供软件上的地址映射,听起来比较玄乎,实际上其原理非常简单。我们下面先来谈一下该技术提出的背景。 我们假设一个64位系统,其内存的基地址是0x80000000,内存大小是4G,则内存的物理地址范围是0x80000000-0x180000000,同时该系统中某个外设的DMA只能按32 bits地址寻址,即寻址范围为0-0...

liuhangtiant的博客 1万+

100G SR4 光模块设计

目前100G SR4 光模块主要采用COB 封装技术,在光电芯片键合(bonding)阶段,首先使用银胶将光芯片、电芯片精准固定在电路板规定位置上,该工序即为元件键合(die bonding);然后采用打线机进行金线键合(wire bonding),完成光模块内部的电气连接。在光路耦合阶段,采用8路阵列透镜组完成光路90°弯折及聚焦,并采用有源耦合的工艺进行光路的最终确认,该设计方案工艺简单、高效,借助全自动贴片机、打线机和耦合台就可实现100G SR4 光模块的大批量生产。

Flyin_Group的博客 1372

用例设计:滴滴打车从轿车到完成支付如何测?

滴滴打车全流程测试用例设计从业务场景覆盖、功能逻辑分解、异常流验证三个维度展开,系统化地构建了测试方案。首先,业务流主干场景被分解为叫车、行程中、支付结算三个阶段,每个阶段都设计了核心测试用例,包括正向和异常用例,如定位准确性、车型选择逻辑、路径偏移监控、费用实时计算、多支付方式兼容等。专项测试补充了状态机验证、资损防控测试和性能测试,确保系统在不同情况下的稳定性和安全性。测试数据策略采用等价类划分设计,实战技巧包括流量回放技术、混沌工程注入和计费沙盒验证,以提高测试的覆盖率和准确性。最终输出交付物包括流程

海姐软件测试的博客 1524

Linux内存管理:什么是CMA(contiguous memory allocation)连续内存分配器?可与DMA结合使用

目录 1. 概述 1.1.为什么在默认版本中使用它 2. 数据结构 3. 流程分析 3.1 CMA区域创建 3.1.1 方式一 根据dts来配置 3.1.2 方式二 根据参数或宏配置 3.2 CMA添加到Buddy System 3.3 CMA分配/释放 3.4 DMA使用 4.CMA利弊 4.1.优点 4.2.缺点 5.为什么要摆脱CMA 5.1.如何摆脱CMA 5.1.1.启用连贯池 5.1.2. DMA分配技巧 5.1.3.离子分配器 6.CMA document

RToax 1万+

魔兽世界怀旧服宏命令全解析:从自动换装到智能判定,老玩家才知道的黑科技

本文全面解析魔兽世界怀旧服宏命令的高级应用,从自动换装到智能判定,揭秘老玩家专属的黑科技技巧。深入探讨怀旧服特有的宏命令机制,包括施法队列、装备切换系统和职业专属技巧,帮助玩家在经典旧世版本中提升战斗效率。

weixin_29230865的博客 727

RK3308修改只读模式为可读可写模式

在rk3308中默认的格式为squashfs(只读模式),运用roofs需要可读可写,要讲格式改为ext2 修改方式 修改kernel下的dts文件: 路径\kernel\arch\arm64\boot\dts\rockchip\下自己的dts文件,将dts文件的chosen { bootargs = “earlycon=uart8250,mmio32,0xff0c0000 swiotlb=1 console=ttyFIQ0 root=PARTUUID=614e0000-0000 rootfstype=sq

Wu996的博客 3171

DBT关键切片重建算法

DBT通过有限角度(通常15°~50°)扫描,获取一系列低剂量投影图,重建出三维断层图像。传统FBP在稀疏角度下会产生严重的“伪影拖尾”和层间干扰。临床诊断中,放射科医生往往只关注几层关键切片(即病灶所在层),其余层仅作参考。

AI的内部世界的博客 89

某AI推荐系统项目管理复盘:架构师总结的6大方法论与调优策略

我是张三,某大厂资深AI架构师,主导过5个千万级用户的推荐系统项目(覆盖电商、内容、视频、音乐、外卖等场景)。我的公众号“AI架构师笔记”会分享更多AI项目管理和技术实战经验,欢迎关注。最后的话:推荐系统不是“一锤子买卖”,而是“持续优化的过程”。希望这篇文章能帮你少踩坑,多做对——毕竟,把复杂的事做成,才是架构师的核心能力。

2501_92132293的博客 362

Linux x86-64 IOMMU详解(五)——Intel IOMMU初始化流程

长图预警!!! 下图完整展示了Intel IOMMU的初始化流程,是对本文所有内容的总结。只要看懂这张图,读者就能够完全理解Intel IOMMU的初始化流程。 接下来,笔者将按流程图的顺序,结合代码,介绍Intel IOMMU初始化流程的一些关键步骤。图中部分细节,本文可能并未提到,读者可结合代码自行理解。

qq_34719392的博客 5669

基于 ESP32 的智能药盒提醒装置设计与实现

本装置基于 ESP32 实现了智能药盒的核心功能,硬件选型兼顾成本与实用性,软件设计模块化、易拓展。后续可通过 ESP32 的 WiFi 模块接入物联网平台(如阿里云、OneNet),实现远程设置提醒、服药状态反馈等功能,进一步提升智能化水平。该装置能有效解决老人忘服药问题,具有较高的实用价值与推广潜力。

weixin_42300449的博客 1043

Kernel下的DMA 地址映射详解

在网上查看了各路大牛的DMA资料,但一直未解决我的问题和疑问; 我的问题就是:这个DMA Buf地址区间在哪,是如何划分的。大部分资料都是 DMA的抽象层,没有讲到具体,比如这个dma_map_single这个函数。这个 phys_addr到底是从哪里来的,是如何受到保护的,以及这个映射关系和dma_unmap_single 取消映射之间,是否涉及到phys_addr的关联。...

求变,从思想开始 9913

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Linux x86_64/arm 分配大块物理连续内存

Linux x86 分配大于4M空间的内存 实现一个PCIe设备驱动,需要分配几个128M的物理连续内存作为DM缓冲区,受制于伙伴系统最多分配4M,所以需要使用到CMA机制,来分配大块的物理连续内存: 硬件平台:x86_64 软件平台:CentOs7.4 linux-3.10.0 linux在x86下支持cma 在x86下linux的swiotlb是使能的,这种情况下cma是不使能的,所以dm...

3035

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

浅析错误:software IO TLB: coherent allocation failed for device

问题背景:i2c controller 在 probe 的时候,使用 dma_alloc_coherent 申请一块可持续使用的 dma 传输 buffer。平台使用 DRAM 大小为 6GB,未出现错误。 平台 DRAM 大小从 6GB 扩展到 8GB,dma_alloc_coherent 报错:"software IO TLB: coherent allocation failed for device"。 调查结果: 简单的原因是,当设定dma_set_mask(&pdev-&g..

sinat_30545941的博客 1449

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

扒开DMA映射的内裤

上次我们说过解决cpu和dma访问内存一致性问题有两种方法,一种是一致性映射,一种是流式映射。无论哪种,本质都是避免cache带来的影响,要么一步到位直接把cache关了,要么只在dma...

Peter的专栏 1523

linux Coherent dma 实现

linux Coherent dma 实现 原创 shenhuxi_yu 最后发布于2019-05-21 01:15:37 阅读数 285 收藏 分类专栏: LINUX ARM C语言 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.youkuaiyun.com/shenhuxi_yu/article/details...

zf1575192187的专栏 1058

在Linux和Xen中实现IOMMU

Utilizing IOMMUs for Virtualization in Linux and XenAbstractIOMMUs are hardware devices that translate device DMA addresses to proper machine physical addresses. IOMMUs have long been used for RAS

hotsolaris的专栏 3693

mem_init

mem_init() marks the free areas in the mem_map and tells us how much memory is free. 即释放内存到伙伴系统,对一些内存方面的全局变量设置 首先我们需要明白mem_map作用,其是描述所有的物理内存采用的struct page结构的数组的基指针。比如说,对于4GB的内存来说,如果一个页定义为4KB,即2^12字节。

wuye110的专栏 3034

Arm linux dma mapping操作

Arm linux dma mapping 目 录 1 概述 3 2 基本概念 3 3 Cache操作 4 3.1 写数据到device 4 3.2 从device读数据 4 3.3 swio技术 4 3.4 代码分析 5 3.4.1 arm64_dma_init 5 3.4.2 dma_map_single 6 3.4.3 dma_unmap_single 8 概述 由于处理器存在cache, ...

osnet的博客 4568

xen pci-passthrough 2

Xen PCI Passthrough Xen version 3.0 released in 2005 was the first version to support PCI passthrough. You can use PCI passthru to assign a PCI device (NIC, disk controller, HBA, USB controller,

cybertan的专栏 4125

TEE可信执行环境

再来简要介绍一下system call(简称syscall)。为了更好的支持权限管理,CPU 提供了RING 0 ~ 3 四个不同的保护域,不同域有不同的指令执行权限。这也被称为分级保护域,Hierarchical Protection Domains。Linux 只使用了其中的两个态,OS 运行于Ring 0(有时候也称为 CPL-0),拥有操作设备的权限。用户程序运行于 Ring 3(CPL-3),仅有使用 CPU 进行计算的权限。我们也习惯将其称之为用户/内核态。

qq_43543209的博客 3410

LWN: 6.1 合并窗口第一部分!

关注了就能看到更多这么棒的文章哦~The first half of the 6.1 merge windowBy Jonathan CorbetOctober 7, 2022DeepL assisted translationhttps://lwn.net/Articles/910312/6.1 合并窗口正在顺利进行中:自从窗口打开以来,已经有 5,752 个 non-merge changes...

Linux News搬运工 368
上一篇: LWN:新增ioctl来检测内存被写入过!
下一篇: LWN:掌握Emacs!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值