文章目录

  • 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 申请内存用法和问题总结相关推荐

  1. dma_alloc_coherent DMA内存申请学习笔记

    说明 dma_alloc_coherent 相关的知识网络上有很多,将相关的知识收集汇总以便于后续遇到问题方便查找.这一次对dma_alloc_coherent进行学习的原因是在使用rapidio驱动 ...

  2. python 申请内存空间、用于创建多维数组_python 申请内存空间,用于创建多维数组的实例...

    以三维数组为例 先申请1个一维数组空间: mat = [None]*d1 d1是第一维的长度. 再把mat中每个元素扩展为第二维的长度: for i in range(len(mat)): mat[i ...

  3. 【Android 逆向】Android 进程代码注入原理 ( 进程注入原理 | 远程调用流程 | 获取函数地址 | 设置 IP 寄存器 | mmap 申请内存 | 设置 SP 寄存器 )

    文章目录 一.进程注入原理 二.远程调用流程 ( 获取 so 动态库地址 | 获取函数地址 | 设置 IP 寄存器 | mmap 申请内存 | 设置 SP 寄存器 ) 一.进程注入原理 调试进程 At ...

  4. 使用VirtualAlloc在0x400000处申请内存

    一开始老是申请内存失败,返回487,后来找到了解决方法,主要就是VirtualAlloc第三个参数不要写MEM_RESERVE,然后申请的空间也不能太大,否则还是会失败的. 假如你看到了这篇文章,我猜 ...

  5. C++中申请内存的正确方法

    申请内存的方法不合理: 合理: 解析:检查内存泄露的最好办法,就是检查完全配对的申请和释放(在代码的同一层次),在函数中申请而在外部释放,将导致代码的一致性变差,难以维护.而且,你写的函数不一定是你自 ...

  6. python申请内存函数_python进阶用法2 【从帮助函数看python内存申请机制】

    前言 介绍了四个帮助函数,dir(),help(),type(),id(),通过id()函数进一步分析了python在申请内存方面的效率问题,提到的基本类型有string,list,queue和deq ...

  7. C++二维数组动态申请内存

    好久没用C++刷题了,今天早上刷了几条题,感觉很陌生了.怪我,大二下实在太颓废了,没啥作为. 今天更新个关于c++二维数组内存申请的问题,当初作为菜鸟初学指针的时候,还是在这方面有点搞不通的.今天用到 ...

  8. 测试C语言malloc申请内存不释放结果

    测试:C语言,用malloc动态申请内存,不free,观察效果. 代码 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include ...

  9. C语言申请内存时堆栈大小限制

    一直都有一个疑问,一个进程可以使用多大的内存空间,swap交换空间以及物理内存的大小,ulimit的stack size对进程的内存使用有怎样的限制?今天特亲自动手实验了一次,总结如下: 开辟一片内存 ...

最新文章

  1. 高级数据结构讲解与案例分析
  2. C++基本知识点集锦(2022秋招)
  3. nohub 将程序永久运行下去
  4. 提高SQL语句的性能
  5. 《构建高可用Linux服务器》卓越网和互动网上架了
  6. hbase查询_【从零单排HBase】HBase高性能查询揭秘
  7. Spark源码分析之Master状态改变处理机制原理
  8. CF932E Team Work(第二类斯特林数)
  9. 电脑右下,电脑右下图标怎么显示出来怎么办
  10. AJAX视频教程下载
  11. H265H264视频流播放
  12. 国务院关于取消一批职业资格许可和认定事项的决定国发〔2016〕5号
  13. 计算机测试性评估,计算机CPU性能评估软件PCMark
  14. 大规模行人检索—PRCV2020竞赛发布
  15. “拼多多”被薅的问题出在哪儿?损失将如何买单?
  16. 我爱淘冲刺阶段站立会议2每天任务6
  17. c语言运行后tecplot云图,tecplot执行fluent后处理截面云图显示-20210327085801.docx-原创力文档...
  18. 深入剖析ISA防火墙策略执行过程
  19. wincc中c语言编写延时,wincc 延时C脚本
  20. 视频点播服务器性能,基于排队论的视频点播系统性能分析

热门文章

  1. Web 3.0让网络巨头们恐慌?Dapp爆发潮的到来会更让人颤抖!
  2. 女生在IT计算机行业适合什么工作
  3. Python爬懂车帝的图片-代码
  4. 美国陪审团裁定福特向车祸遇难者家属赔偿17亿美元
  5. 三色螺旋线 -《跟小海龟学Python》案例代码
  6. 父亲节手抄报内容大全
  7. z自建服务器,《守望先锋》将加入自建服务器 自定规则
  8. DeFi+NFT+DAO,MIGO打造区块链新金融雏形
  9. 【Rust 日报】2021-12-23 Rust有什么是Zig所没有的?
  10. 2020年计算机网络王道_2020年8种最大的网络安全威胁