一致性DMA --- linux kernel 实现赏析

浅析Linux设备DMA机制:DMA内存映射 现代计算机系统中,CPU访问内存需要经过Cache,但外部设备通常不感知Cache的存在,因此CPU和外设在访问DMA内存时,必须谨慎处理内存数据的一致性问题。为了处理这种一致性问题,同时为了兼顾多种设备类型,Linux系统会采用不同的规则来映射DMA内存,开发者遵循这套规则对DMA内存进行操作。 阅读详情
void *dma_alloc_attrs(struct device *dev, size_t size, dma_addr_t *dma_handle,
		gfp_t flag, unsigned long attrs)
{
	const struct dma_map_ops *ops = get_dma_ops(dev);
	void *cpu_addr;

	WARN_ON_ONCE(!dev->coherent_dma_mask);

	if (dma_alloc_from_dev_coherent(dev, size, dma_handle, &cpu_addr))
		return cpu_addr;

	/* let the implementation decide on the zone to allocate from: */
	flag &= ~(__GFP_DMA | __GFP_DMA32 | __GFP_HIGHMEM);

	if (dma_alloc_direct(dev, ops))
		cpu_addr = dma_direct_alloc(dev, size, dma_handle, flag, attrs);
	else if (ops->alloc)
		cpu_addr = ops->alloc(dev, size, dma_handle, flag, attrs);
	else
		return NULL;

	debug_dma_alloc_coherent(dev, size, *dma_handle, cpu_addr);
	return cpu_addr;
}
没有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)。 阅读详情

相关推荐

解析Linux DMA mapping机制

DMA(Direct Memory Access):直接存储器访问;Non-DMA:CPU直接与设备进行数据交互,CPU的负载会随着数据的读写而增加;DMA:CPU不参与数据的直接传输,DMA Controller负责Device与Memory之间的数据搬运,并以中断信号的形式通知CPU;可以看出,使用DMA的最大优点是可以提高CPU的使用率;Linux内核源码技术学习路线+视频教程内核源码Linux内核源码内存调优文件系统进程管理设备驱动/网络协议栈。

youzhangjing_的博客 660

linux Coherent dma 实现

linux 4.9 armv8 void *dma_alloc_coherent(struct device *dev, size_t size,dma_addr_t *dma_handle, gfp_t flag) 参数:dev device 结构体中有dma相关的控制比如dma_mask,dma_handle 作实参传递返回的pa,flag分配memory时的控制选项比如GFP_KER...

shenhuxi_yu的专栏 3543

深入浅出 Linux 中的 ARM IOMMU SMMU III

系统 I/O 设备驱动程序通常调用其特定子系统的接口为 DMA 分配内存,但最终会调到 DMA 子系统的等接口。等接口通过 DMA IOMMU 的回调分配内存,并为经过 IOMMU 的 DMA 内存访问准备转换表。之后经过 IOMMU 的 DMA 内存访问所需的所有工作都已完成。音频子系统 ALSA 的驱动程序,通过等函数为 DMA 分配内存,这些函数定义 (位于和函数用于DMA 内存,两者的区别在于,前者为单个子流预分配,后者为某个 PCM 下的所有子流预分配。它们都通过函数为某个子流预分配内存。

tq08g2z的专栏 3124

杂谈 linux DMA内存

这块物理块会记录在 cma_areas[cma_area_count] 中,然后 dma_contiguous_default_area 指向这块物理块。不同的mask,对应从不同的zone获取内存。2 dma_contiguous_default_area 没货了,则优先从dma zone获取page。最后将64为的物理地址对应到32位的dma地址,phys_attr_t转化位dma_attr_t。注意了,开始找的地方是从dma的边界往下(arm64_dma_phys_limit)。

m0_37797953的博客 1363

避坑指南:STM32移植CanFestival时那些没人告诉你的细节(含TJA1050硬件适配)

本文深入解析STM32移植CanFestival协议栈时的关键细节与TJA1050硬件适配技巧,涵盖AVR残留代码清理、定时器中断优化及CAN通信稳定性提升方案。特别针对TJA1050在特定波特率下的信号畸变问题提供实战解决方案,帮助开发者规避移植过程中的隐形陷阱,实现工业级稳定通信。

work3的博客 760

ARM架构下的SLAM部署避坑指南:香橙派AIpro与D435i深度相机的实战解析

本文详细解析了在ARM架构的香橙派AIpro开发板上部署SLAM算法并与Intel D435i深度相机配合的实战经验。内容涵盖系统配置、ROS编译、驱动安装、算法优化等关键步骤,提供了具体的避坑指南和性能调优技巧,帮助开发者在嵌入式平台上高效实现实时SLAM应用。

f0g1h2的博客 980

没有IOMMU的DMA操作

我们知道DMA通常需要访问连续的物理内存,除非设备支持iommu,当设备不支持iommu的话可以用以下方式:在内核启动时为设备保留内存将MMU内嵌到设备中,如GPU这里GPU MMU的方式...

Peter的专栏 3154

【Qt-4】QT基于qhttp-server搭建http服务器

QT搭建http服务器

WXG1011的博客 5712

两种类型的DMA mapping:一致性DMA映射&流式DMA映射 (5.10)

一致性DMA:在驱动初始化时mapping,在驱动shutdown时unmapping**(意味着不是一次性的,是持续性的使用该DMA映射)**。硬件需要保证外设和CPU能并行访问同一块数据,并且保证在软件无显式flush操作的情况下,CPU和外设能同步看到对方对数据的更新。一致性(consistent)可以理解为同步(synchronous)。 api:dma_alloc_coherent 直接从dma区域申请内存。 流式DMA:一般是需要一次DMA transfer时map,传输结束后unm

gjioui123的博客 3653

使用在UE5中使用AirSim插件Eigen库头文件引用报错,出现报错的解决方式

如图所示,用红线圈出的两条头文件引用会报错,提示无法找到他们,但是可以发现的是,他们的路径书写是没有问题的。在终端中运行时候,会出现如下的报错。

GFCLJY的博客 1006

Linux下OpenFire+Spark即时通讯环境搭建全攻略(含证书错误解决方案)

本文提供了一份详尽的Linux环境下OpenFire服务器与Spark客户端即时通讯系统的搭建与配置全攻略。内容涵盖从环境规划、服务端部署、数据库配置到客户端连接的全流程,并重点解决了Spark连接时常见的证书验证错误问题,为企业构建私有化、高可用的XMPP通讯平台提供了实战指导。

weixin_29251131的博客 165

java dma_Kernel DMA

为什么会有DMA(直接内存访问)?我们知道通常情况下,内存数据跟外设之间的通信是通过cpu来传递的。cpu运行io指令将数据从内存拷贝到外设的io端口,或者从外设的io端口拷贝到内存。由于外设的访问速度跟内存的访问速度相比非常慢,因此这种访问操作会严重浪费cpu的指令周期,DMA的出现就是为了解决这个问题。支持DMA机制的系统通常会包含一个DMA控制器,下挂支持DMA的外设,外设和内存之间的数据交...

weixin_30523989的博客 648

实战测评:4大搜索API(You.com/Tavily/Exa/Perplexity)谁更适合你的AI项目?附Python调用代码

本文实战测评了You.com、Tavily、Exa和Perplexity四大搜索API在AI项目中的集成应用,详细对比了它们的技术特性和Python调用方法。针对LLM实时数据需求,You.com的优化设计表现突出,支持32k大上下文窗口和快速响应。文章提供了完整的代码示例和场景化选型建议,帮助开发者高效集成搜索API到AI项目中。

weixin_42569329的博客 478

arm64下dma相关 api(4.19)

上述使用ops->alloc来分配;

gjioui123的博客 1232

【OpenClaw从入门到精通】第41篇:2026年4月最新版——从零开始搭建你的第一个安全AI助理(保姆级实战教程)

2026年3月CNCERT联合发布《OpenClaw安全使用实践指南》后,安全部署成为OpenClaw使用的核心前提。本文针对新手及进阶用户,基于官方安全指引,提供三套实战部署方案:阿里云一键部署(新手首选)、Docker容器隔离部署(进阶推荐)、本地安全安装(测试专用),并详解阿里云百炼Coding Plan API接入流程。全文涵盖环境准备、分步实操、安全加固、问题排查等全流程,所有命令可直接复制执行,无需依赖外部代码库。通过本文,读者可零基础搭建安全隔离的OpenClaw AI助理,兼顾实用性与安全性

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

如何在 R 中执行 Kruskal-Wallis 检验

Kruskal-Wallis 检验用于确定三个或更多独立组的中位数之间是否存在统计学上的显着差异。它被认为是单向方差分析的非参数等效项。本教程介绍了如何在 R 中执行 Kruskal-Wallis 检验。示例:R 中的 Kruskal-Wallis 检验 假设研究人员想知道三种不同的肥料是否会导致不同水平的植物生长。他们随机选择 30 种不同的植物并将它们分成三组,每组 10 株,每组施用不同的肥料。在一个月结束时,他们测量每株植物的高度。使用以下步骤执行 Kruskal-Wallis 检验以确定三个组的中

Mrrunsen的博客 3797

Linux x86-64 IOMMU详解(六)——Intel IOMMU参与下的DMA Coherent Mapping流程

在上一篇文章中,我们详细介绍了Intel IOMMU的初始化流程,并耗费大量笔墨讲述了此过程中Intel IOMMU与SWIOTLB二虎相争的故事。最终,SWIOTLB被禁用,而Intel IOMMU得以保留。现在,所有的DMA操作,都要经由Intel IOMMU了。本文将介绍Intel IOMMU在DMA Coherent Mapping过程中的作用。

qq_34719392的博客 5504

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Linux内存管理 - 内存申请(一)

但位置不同,kmalloc()分配的内存处于3GB~high_memory之间,而vmalloc()分配的内存在VMALLOC_START~4GB之间,也就是非连续内存区。由于 vmalloc() 没有保证申请到的是连续的物理内存,因此对申请的内存大小没有限制,如果需要申请较大的内存空间就需要用此函数了。kmalloc分配的内存,它的物理地址与虚拟地址只有一个PAGE_OFFSET偏移,不需要为地址段修改页表,而vmalloc分配内存时需要修改主内核页表.然后逐页分配内存来从物理上填充hole。

zxcv788999的博客 1513

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

DMA Coherent Mapping

一般我们通过dma_alloc_coherent 和 dma_free_coherent 来申请和释放coherent memory。申请coherent memory的代价比较大,推荐只有在要申请的memory大于1个page是才推荐用,否则推荐用dma_pool 来申请. static inline void *dma_alloc_coherent(struct device *dev, s

jason的笔记 4945

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

dma_alloc_wc

returnvoid *cpu_addr =elsevoid *if (!return。

wmzjzwlzs的专栏 1000

dma_alloc_coherent的第三个参数dma_handle 分析

我们在通过dma_alloc_coherent申请一致性dma内存 static inline void *dma_alloc_coherent(struct device *dev, size_t size,         dma_addr_t *dma_handle, gfp_t flag) {     return dma_alloc_attrs(dev, size, dma_ha

jason的笔记 4519

dma_alloc_coherent的2种内存分配方式

1、从系统内存分配物理地址和虚拟地址 dma_alloc_coherent(dev, GFP_KERNEL | GFP_DMA) 可被中断 dma_alloc_coherent(dev, GFP_ATOMIC) = pci_alloc_consistent 从预留的cma_pool分配,不可被中断 上述直接调用方式只能从Iinux管理系统内存中动态分配 2、从mem_region区域分配内存 device_tree: aaa_pgtable_reserved { compatible....

suifengershi2000的博客 3703

dma_alloc_from_coherent 由于mem为null 返回

我们直到dma_alloc_coherent->dma_alloc_attrs static inline void *dma_alloc_attrs(struct device *dev, size_t size,                        dma_addr_t *dma_handle, gfp_t flag,                        unsign

jason的笔记 2954

DMA-API(alloc和free)调用流程分析(十)

当使用IOMMU且使能DMA-IOMMU中间层时,使用DMA API接口alloc、free、map、unmap内存时,底层都会调用到IOMMU API,最终调用到SMMUv3驱动,完成内存的map和unmap。调用流程如下图所示。

非专业业余程序员 1224

dma_alloc_coherent 申请内存用法和问题总结

检查内核打印,给cma分配的地址是否在4G以上,dma_allocat_coherent() 要求地址低于掩码[(0x1 << 32)-1] = 0xFFFFFFFF。4M这个限制是本身应该是分的普通内存的限制, 例如把配置加一个CONFIG_FORCE_MAX_ZONEORDER=16把最大限制改成128M也能解决。使用这个接口最大只能申请到4M的内存,申请超过4M时,报。在dts中添加cma节点,可指定cma大小和空间。,dma分配默认会走cma,空间会大点。可配置大小,也可指定地址。

kunkliu的博客 8616

linux - DMA

linux DMA 操作

vertor11的博客 359
上一篇: phy state machine 与 rate --- linux kernel 欣赏
下一篇: 论新进程的加入 --- Linux kernel
leesagacious
博客等级 码龄12年 146粉丝 179原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值