dma_alloc_coherent 申请内存用法和问题总结
文章目录
- 1、dma_alloc_coherent用法
- 2、问题
- 3、解决方法
- 方法一,走CMA空间配置
- 3.1 内核配置``CONFIG_CMA``
- 3.2 修改cma起始地址
- 3.3 设置cma空间(大小和地址等)
- 3.3.1 内核配置
- 3.3.2 cmdline配置
- 3.3.3 dts配置
- 方法二,修改内核代码
- 参考
1、dma_alloc_coherent用法
通过dma_alloc_coherent接口可以申请连续的大块内存。
dma_addr_t dma_handle;
cpu_addr = dma_alloc_coherent(dev, size, &dma_handle, gfp);
入参:
dev: ``struct device *``,可设为NULL
size: 想要申请的内存长度,单位为bytes
gfp: 分配内存时的标志位,如GFP_KERNEL等,在此不多介绍
出参
cpu_addr: 内存虚拟其实地址
dma_handle: 实际物理地址
2、问题
使用这个接口最大只能申请到4M的内存,申请超过4M时,报swiotlb buffer is full (sz: 16777216 bytes)
错误。
3、解决方法
方法一,走CMA空间配置
3.1 内核配置CONFIG_CMA
在内核配置CONFIG_CMA=y
,dma分配默认会走cma,空间会大点。
cat /proc/meminfo |grep Cma 可查看设备上cma空间大小。
3.2 修改cma起始地址
按照3.1设置后,有时仍然报swiotlb错误.
参考一个大佬的回答,总结如下:
检查内核打印,给cma分配的地址是否在4G以上,dma_allocat_coherent() 要求地址低于掩码[(0x1 << 32)-1] = 0xFFFFFFFF。如果地址大于这个,它将回退到 swiotlb 缓冲区。
因此需要指定cma空间分配的地址,方法见3.3
3.3 设置cma空间(大小和地址等)
3.3.1 内核配置
配置CONFIG_CMA=y
后,cma空间应默认为64M.
如果需要修改,先配置CONFIG_DMA_CMA=y
打开DMA Contiguous Memory Allocator, 再配置CONFIG_CMA_SIZE_MBYTES
大小就行。
相关配置:
CONFIG_DMA_CMA | |
CONFIG_CMA_AREAS | 配置 CMA 分配器区域数 |
CONFIG_CMA_SIZE_MBYTES | 配置 CMA 的大小 |
CONFIG_CMA_SIZE_SEL_MBYTES | 按 MB 配置 CMA 区域大小 |
CONFIG_CMA_SIZE_SEL_PERCENTAGE | 按物理内存的百分比配置 CMA 区域大小 |
CONFIG_CMA_SIZE_SEL_MIN | 优先选择最小的 CMA 体积 |
CONFIG_CMA_SIZE_SEL_MAX | 优先选择最大的 CMA 体积 |
CONFIG_CMA_ALIGNMENT CMA | 对齐大小 |
优点:
配置简单便捷。
缺点:
不能指定cma区域的地址。
3.3.2 cmdline配置
可通过cmdline配置cma空间属性。用法说明:
cma=nn[MG]@[start[MG][-end[MG]]][ARM,X86,KNL]Sets the size of kernel global memory area forcontiguous memory allocations and optionally theplacement constraint by the physical address range ofmemory allocations. A value of 0 disables CMAaltogether. For more information, seeinclude/linux/dma-contiguous.h
例如:
cma=128M /* 设置一个128M的cma空间 */
cma=128M@0x8000000 /* 设置一个128M的cma空间并指定起始地址为0x8000000 */
cma=256M@0-4G /* 在0-4G范围内设置一个256M的cma空间 */
cma=256M@0-4G
可解决上述dma_allocat_coherent要求地址在0~4G范围内的问题。
优点:
可配置大小,也可指定地址。
可通过uboot传参,也可内核指定CMDLINE。
3.3.3 dts配置
在dts中添加cma节点,可指定cma大小和空间。
方法二,修改内核代码
4M这个限制是本身应该是分的普通内存的限制, 例如把配置加一个CONFIG_FORCE_MAX_ZONEORDER=16把最大限制改成128M也能解决。
23 /* Free memory management - zoned buddy allocator. */24 #ifndef CONFIG_FORCE_MAX_ZONEORDER25 #define MAX_ORDER 1126 #else27 #define MAX_ORDER CONFIG_FORCE_MAX_ZONEORDER28 #endif29 #define MAX_ORDER_NR_PAGES (1 << (MAX_ORDER - 1))
"./include/linux/mmzone.h"
参考
For the problem when using swiotlb
dma_alloc_coherent failed on x86_64 but works on i686
dma_alloc_coherent 申请内存用法和问题总结相关推荐
- dma_alloc_coherent DMA内存申请学习笔记
说明 dma_alloc_coherent 相关的知识网络上有很多,将相关的知识收集汇总以便于后续遇到问题方便查找.这一次对dma_alloc_coherent进行学习的原因是在使用rapidio驱动 ...
- python 申请内存空间、用于创建多维数组_python 申请内存空间,用于创建多维数组的实例...
以三维数组为例 先申请1个一维数组空间: mat = [None]*d1 d1是第一维的长度. 再把mat中每个元素扩展为第二维的长度: for i in range(len(mat)): mat[i ...
- 【Android 逆向】Android 进程代码注入原理 ( 进程注入原理 | 远程调用流程 | 获取函数地址 | 设置 IP 寄存器 | mmap 申请内存 | 设置 SP 寄存器 )
文章目录 一.进程注入原理 二.远程调用流程 ( 获取 so 动态库地址 | 获取函数地址 | 设置 IP 寄存器 | mmap 申请内存 | 设置 SP 寄存器 ) 一.进程注入原理 调试进程 At ...
- 使用VirtualAlloc在0x400000处申请内存
一开始老是申请内存失败,返回487,后来找到了解决方法,主要就是VirtualAlloc第三个参数不要写MEM_RESERVE,然后申请的空间也不能太大,否则还是会失败的. 假如你看到了这篇文章,我猜 ...
- C++中申请内存的正确方法
申请内存的方法不合理: 合理: 解析:检查内存泄露的最好办法,就是检查完全配对的申请和释放(在代码的同一层次),在函数中申请而在外部释放,将导致代码的一致性变差,难以维护.而且,你写的函数不一定是你自 ...
- python申请内存函数_python进阶用法2 【从帮助函数看python内存申请机制】
前言 介绍了四个帮助函数,dir(),help(),type(),id(),通过id()函数进一步分析了python在申请内存方面的效率问题,提到的基本类型有string,list,queue和deq ...
- C++二维数组动态申请内存
好久没用C++刷题了,今天早上刷了几条题,感觉很陌生了.怪我,大二下实在太颓废了,没啥作为. 今天更新个关于c++二维数组内存申请的问题,当初作为菜鸟初学指针的时候,还是在这方面有点搞不通的.今天用到 ...
- 测试C语言malloc申请内存不释放结果
测试:C语言,用malloc动态申请内存,不free,观察效果. 代码 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include ...
- C语言申请内存时堆栈大小限制
一直都有一个疑问,一个进程可以使用多大的内存空间,swap交换空间以及物理内存的大小,ulimit的stack size对进程的内存使用有怎样的限制?今天特亲自动手实验了一次,总结如下: 开辟一片内存 ...
最新文章
- 高级数据结构讲解与案例分析
- C++基本知识点集锦(2022秋招)
- nohub 将程序永久运行下去
- 提高SQL语句的性能
- 《构建高可用Linux服务器》卓越网和互动网上架了
- hbase查询_【从零单排HBase】HBase高性能查询揭秘
- Spark源码分析之Master状态改变处理机制原理
- CF932E Team Work(第二类斯特林数)
- 电脑右下,电脑右下图标怎么显示出来怎么办
- AJAX视频教程下载
- H265H264视频流播放
- 国务院关于取消一批职业资格许可和认定事项的决定国发〔2016〕5号
- 计算机测试性评估,计算机CPU性能评估软件PCMark
- 大规模行人检索—PRCV2020竞赛发布
- “拼多多”被薅的问题出在哪儿?损失将如何买单?
- 我爱淘冲刺阶段站立会议2每天任务6
- c语言运行后tecplot云图,tecplot执行fluent后处理截面云图显示-20210327085801.docx-原创力文档...
- 深入剖析ISA防火墙策略执行过程
- wincc中c语言编写延时,wincc 延时C脚本
- 视频点播服务器性能,基于排队论的视频点播系统性能分析