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

【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使用情况可以帮助优化系统配置和应用程序设计。


http://www.kler.cn/news/327513.html

相关文章:

  • IP地址与5G时代的万物互联
  • 享元模式
  • 【MATLAB源码-第178期】基于matlab的8PSK调制解调系统频偏估计及补偿算法仿真,对比补偿前后的星座图误码率。
  • 智慧农业案例 (一)- 自动化机械
  • vue2圆形标记(Marker)添加点击事件不弹出信息窗体(InfoWindow)的BUG解决
  • 05-函数传值VS传引用
  • 2.点位管理|前后端如何交互——帝可得后台管理系统
  • 基础漏洞——SSTI(服务器模板注入)
  • leetcode-134. 加油站-贪心策略
  • 数据结构与算法学习(2)
  • 汽车灯光系统详细介绍
  • 【机器学习】---深入探讨图神经网络(GNN)
  • 【STM32】 TCP/IP通信协议(3)--LwIP网络接口
  • 将 Intersection Observer 与自定义 React Hook 结合使用
  • 基于RPA+BERT的文档辅助“悦读”系统 | OPENAIGC开发者大赛高校组AI创作力奖
  • ruoyi-python 若依python版本部署及新增模块
  • 基于springboot+微信小程序社区超市管理系统(超市3)(源码+sql脚本+视频导入教程+文档)
  • 使用 CMake 构建 C 语言项目
  • 《Zeotero的学习》
  • Linux中安装ffmpeg
  • 随手记:牛回速归
  • Simulink仿真中get_param函数用法
  • 代码随想录算法训练营Day14
  • 【C#】CacheManager:高效的 .NET 缓存管理库
  • PCL库简单NDT算法配准
  • mini-lsm通关笔记Week2Overview
  • SpringBoot中使用XXL-JOB实现灵活控制的分片处理方案
  • C++的类型转换
  • Redis: 主从复制读写分离环境搭建
  • 2024电脑视频剪辑软件全解析与推荐