当前位置: 首页 > news >正文

【Linux系列】CMA (Contiguous Memory Allocator) 简单介绍

CMA (Contiguous Memory Allocator)

CMA是Linux内核中的一种内存分配机制,用于分配物理上连续的内存块。它主要解决了在系统运行一段时间后,物理内存碎片化导致难以分配大块连续物理内存的问题。

CMA的工作原理
  1. 在系统启动时,CMA会预留一块连续的物理内存区域。
  2. 这块内存在正常情况下可以被普通进程使用。
  3. 当需要分配大块连续物理内存时,CMA会将这些普通进程的内存迁移出去。
  4. 迁移完成后,就可以分配出所需的连续物理内存块。
CMA的配置

CMA可以通过内核启动参数或设备树进行配置:

  1. 内核启动参数方式:

    cma=128M@0-2G
    

    这表示在0-2G的物理内存范围内预留128M的CMA区域。

  2. 设备树方式:

    reserved-memory {#address-cells = <2>;#size-cells = <2>;ranges;cma_region: cma@10000000 {compatible = "shared-dma-pool";reusable;reg = <0x0 0x10000000 0x0 0x8000000>;};
    };
    

    这定义了一个从0x10000000开始,大小为128M的CMA区域。

查看CMA信息
  1. 使用 dmesg 命令查看启动日志中的CMA信息:

    $ dmesg | grep cma
    [    1.064932] OF: reserved mem: initialized node linux,cma, compatible id shared-dma-pool
    [    1.162326] Memory: 1999260K/2078720K available (17408K kernel code, 2124K rwdata, 5528K rodata, 3200K init, 805K bss, 71268K reserved, 8192K cma-reserved)
    

    这里可以看到CMA预留了8192K(8MB)的内存。

  2. 查看 /proc/meminfo 文件:

    $ cat /proc/meminfo | grep CMA
    CmaTotal:          8192 kB
    CmaFree:           8192 kB
    

    这显示了CMA总大小和当前可用大小。

  3. 使用 cat /proc/iomem 命令查看CMA内存区域:

    $ cat /proc/iomem | grep cma
    10000000-107fffff : cma-reserved
    

    这显示了CMA预留内存的物理地址范围。

  4. 对于支持CMA的设备,可以查看其sysfs条目:

    $ ls /sys/devices/.../cma/
    

    这里可能会显示设备特定的CMA使用情况。

  5. 在某些系统上,可以通过debugfs查看更详细的CMA信息:

   $ cat /sys/kernel/debug/cma/cma-*

这可能会显示CMA区域的使用统计和分配情况。

CMA的优势
  1. 解决了运行时大块连续物理内存分配的问题。
  2. 提高了内存利用率,预留的CMA区域在不使用时可以被其他进程使用。
  3. 对于需要DMA的设备驱动非常有用,如视频处理、图形加速等。
CMA的局限性
  1. 内存迁移过程可能会引入一定的延迟。
  2. 不适合实时性要求极高的场景。
  3. 需要合理规划CMA区域大小,过大会浪费内存,过小则可能无法满足需求。
注意事项
  • CMA内存分配应该谨慎使用,仅在确实需要大块连续物理内存时才使用。
  • 在使用CMA时,要注意可能的内存竞争问题,合理规划CMA区域大小。
  • 在多核系统中使用CMA时,需要考虑NUMA架构的影响。

通过合理使用和监控CMA,可以有效解决某些硬件设备对大块连续物理内存的需求,提高系统的灵活性和性能。定期检查CMA使用情况可以帮助优化系统配置和应用程序设计。

相关文章:

  • 【QT Quick】基础语法:基础类与控件
  • 【分页】Spring Boot 列表分页 + javaScript前台展示
  • 程序员如何提升并保持核心竞争力?——深入钻研、广泛学习与软技能的培养
  • Grafana链接iframe嵌入Web前端一直跳登录页面的问题记录
  • python自动更新chromedriver
  • swiper+fixed的错误,splice函数的使用,提取年月日substring
  • [每日一练]利用自连接实现数量查询
  • MySQL | excel数据输出insert语句
  • 第167天:应急响应-日志自动提取分析项目_ELK_Logkit_LogonTracer_Anolog等
  • 力扣随机一题——所有元音按顺序排序的最长字符串
  • 数据驱动农业——助力作物增产
  • 新书推荐——《Python贝叶斯深度学习》
  • 基于php的民宿预订管理系统
  • 计算机视觉学习---图像增强
  • 图像处理基础知识点简记
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • export和import的用法总结
  • JavaScript设计模式之工厂模式
  • Java小白进阶笔记(3)-初级面向对象
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • Webpack入门之遇到的那些坑,系列示例Demo
  • 闭包--闭包之tab栏切换(四)
  • 编写高质量JavaScript代码之并发
  • 聊聊flink的TableFactory
  • 前端设计模式
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 思否第一天
  • 硬币翻转问题,区间操作
  • 云大使推广中的常见热门问题
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • ​Linux·i2c驱动架构​
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • ​数据结构之初始二叉树(3)
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • #1015 : KMP算法
  • #QT(TCP网络编程-服务端)
  • #前后端分离# 头条发布系统
  • $.ajax()
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (Oracle)SQL优化技巧(一):分页查询
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (八)Spring源码解析:Spring MVC
  • (翻译)terry crowley: 写给程序员
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (实测可用)(3)Git的使用——RT Thread Stdio添加的软件包,github与gitee冲突造成无法上传文件到gitee
  • (转)Unity3DUnity3D在android下调试
  • ***检测工具之RKHunter AIDE
  • 、写入Shellcode到注册表上线