内存管理(三)--Linux CMA内存使用

文章目录

  • 一、预留一段内存常用方法
    • 1.1 设备树定义reserve memory
  • 二、内存节点常见属性
    • 2.1 no-map和reusable使用上的区别
  • 三、预留CMA的reserved memory方法
    • 3.1 共享cma(采用设备树)
    • 3.2 共享cma(采用bootargs)
    • 3.3 私有cma
  • 四、使用reserved memory


我们日常使用kmalloc最多只能动态申请到4M(2^order)内存,当我们需要大块连续内存时,就需要借助CMA申请大内存。
CMA内存分配器在系统中具有多种重要作用,包括分配连续大块内存、提高内存利用率、提供灵活性与可迁移性、优化性能以及简化内存管理等。这些作用共同使得CMA成为嵌入式系统和其他需要连续内存支持的应用场景中的重要技术之一。

前文讲了Linux几种内存预留方法,本文主要讲解Linux里预留CMA内存方法和使用。


一、预留一段内存常用方法

1.1 设备树定义reserve memory

如果需要保留一段内存,在reserved-memory 节点下定义新节点。

reserved-memory {#address-cells = <0x2>;#size-cells = <0x2>;...fb_reserved0: framebuffer{reg = <0x1 0x10000000 0x0 0x8000000>; //addr:0x110000000  128M... //指定这个内存的属性,如:no-map, reusable};....};      

如果要将这个内存私有指定设备里,由指定设备节点使用,通过memory-region字段进行引用(指定给节点fb1使用):

  fb1 {compatible = "xx,xxx";memory-region = <&fb_reserved0>;  //引用这段内存私有到这个设备interrupt-parent = <&gic>;interrupts = <GIC_SPI 27 IRQ_TYPE_LEVEL_HIGH>;interrupt-names = "xx";...};

二、内存节点常见属性

预留内存可以指定常用的属性,常见有:
1. reusable:表示当前的内存区域除了被dma使用之外,还可以被内存管理(buddy)子系统reuse。
2. no-map:表示是否需要创建页表映射,对于通用的内存,必须要创建映射才可以使用,共享CMA是可以作为通用内存进行分配使用的,因此必须要创建页表映射。
3. linux,cma-default:如果要cma区域为共享区域,需要配置上linux,cma-default属性。 指定了 linux,cma-default 属性,内核在分配 cma 内存时会将这片内存当成默认的 cma 分配池使用,执行内存申请时如果没有指定对应的 cma 就使用默认 cma pool。
4. alignment:对齐参数,保留内存的起始地址需要向该参数对齐
5. alloc-ranges:指定可以用来申请动态保留内存的区间.
6. shared-dma-pool(compatible="shared-dma-pool")
有的时候设备驱动程序需要采用DMA的方式使用预留的内存,对于这种场景,可以dts中的节点属性设置为shared-dma-pool,从而生成为特定设备驱动程序预留的DMA内存池。这样,设备驱动程序仅需要以常规方式使用DMA API。

2.1 no-map和reusable使用上的区别

如上已经介绍了no-map和reusable的特点,显著区别在于这几点:

  1. 是否需要将这块内存进行系统管理,放入buddy中管理。
  2. no-map保留的内存区域已被内核排除,因此iomem信息(/proc/iomem)显示系统RAM小于主板中的内存量。
  3. no-map由于没有创建映射表,因此使用时需要通过ioremap/ioremap_nocache
    /memremap等方式将内存映射出使用。

三、预留CMA的reserved memory方法

cma内存可以理解为是借用了reserve memory节点,可以使用DMA通用映射框架的API对其内存进行申请和使用。
编译内核时需要开启以下配置宏使用cma:

(1)配置宏CONFIG_CMA,启用连续内存分配器。
(2)配置宏CONFIG_CMA_AREAS,指定CMA区域的最大数量,默认值是7。
(3)配置宏CONFIG_DMA_CMA,启用允许设备驱动分配内存的连续内存分配器

cma内存可以将reserve memory分为私有cma和共享cma区域。

3.1 共享cma(采用设备树)

共享cma,将从系统全局自动配置一个连续分配区域 ,所有设备驱动在需要cma内存的时可以从这里面申请,不需要的时候,将作为buddy给系统使用。
标准定义方法如下,定义节点为linux,cma节点定义属性为:shared-dma-pool,reusable,linux,cma-default

reserved-memory {  / / 需要预留内存放在这个reserved-memory节点内定义#address-cells = <0x2>;#size-cells = <0x2>;ranges;cma_reserved: linux,cma {compatible = "shared-dma-pool";reusable;//表示 cma 内存可被 buddy 系统使用size = <0x0 0x80000000>; // 2GBalignment = <0x0 0x2000>; // 8KBlinux,cma-default; //作为cma默认内存池};....
};

3.2 共享cma(采用bootargs)

共享cma也通过内核参数“cma”配置全局CMA区域的大小。
使用内核参数“cma=nn[MG]@[start[MG][-end[MG]]]”设置全局CMA区域的大小和物理地址范围。

3.3 私有cma

reserved memory除了共享cma以外定义方式,其他认为是私有cma。个人认为,为方便区分,cma内存通常指共享池的cma,其他方式的就都称为reserved内存。
如上3.1 案例就是私有cma预留方式,通常配合各种属性对这个内存进行定义。


四、使用reserved memory

当内存compatible为shared-dma-pool。这时候设备驱动程序可以采用DMA的方式去使用预留的内存

  1. 设置设备寻址能力mask: dma_set_coherent_mask/dma_set_mask(一致/非一致性) 。这个会影响cma申请地址大小:2^mask。
  2. 通过of_reserved_mem_device_init来将从设备树memory-region获取内存地址私有化到设备里。
  3. 驱动通过接口dma_alloc_coherentdma_alloc_noncoherent(一致/非一致性)用来分配内存,接口dma_free_coherent和dma_free_noncoherent用来释放内存。

其他类型的内存需要通过如:ioremap/ioremap_nocache/memremap等,映射出内存地址使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/878580.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构】--初始集合框架

1. 什么是集合框架 集合框架:Java中已经实现好的集合类&#xff08;一些已经由Java实现好的数据结构&#xff09;。Java的数据结构和C语言的数据结构是没有什么区别的&#xff0c;里面的区别就只是实现的语言不一样。不可能出现Java的单链表和C语言实现的单链表是两个不同的东…

idea配置svn发现安装的svn中的bin目录下没有svn.exe文件

问题描述 使用idea配置svn时&#xff0c;发现安装的svn没有svn.exe文件 解决方法 1、双击svn安装包&#xff0c;找到【modify】 2、默认安装时&#xff0c;没有安装command line client tools&#xff0c;里面是有svn.exe 3、选择will be installed on local hard drive 4、…

idea中使用git提交代码报错husky > pre-commit

1、原因&#xff1a; 本地项目中的.git下的一个文件导致的提交失败&#xff0c;这个文件是pre-commit文件。由于预提交钩子pre-commit导致的提交失败&#xff0c;通过删除.git/hooks/pre-commit文件可以解决 2、解决步骤&#xff1a; 1、找到项目中的.git文件夹&#xff0c;…

公园智能厕所引导大屏,清楚显示厕位有无人状态

在科技飞速发展的今天&#xff0c;公园的设施也在不断与时俱进。其中&#xff0c;公园智能厕所引导大屏的出现&#xff0c;为游客带来了全新的如厕体验。 走进公园的智能厕所区域&#xff0c;首先映入眼帘的便是那醒目的引导大屏。屏幕上清晰地显示着各个厕位的有无人状态&…

4款电脑数据恢复软件分享,告别天价恢复!

大家应该都经历过数据丢失吧&#xff0c;这不&#xff0c;前两天&#xff0c;我那电脑不知怎的&#xff0c;突然就把我辛苦整理的文件夹给“咔嚓”一声删掉了。这下可好&#xff0c;我那里面可是有我好几个月的心血啊&#xff01;好在&#xff0c;我之前也发生过类似的事情&…

【通俗理解】最优控制之旅——强化学习中的策略优化

【通俗理解】最优控制之旅——强化学习中的策略优化 关键词提炼 #最优控制 #强化学习 #状态值函数 #奖励函数 #折扣因子 #贝尔曼方程 #策略迭代 #值迭代 #动态规划 #马尔可夫决策过程 第一节&#xff1a;最优控制的类比与核心概念 1.1 最优控制的类比 最优控制就像是一位精…

视联动力数字科技新成果闪耀2024数博会

在2024年的8月28日至30日&#xff0c;贵阳举办的中国国际大数据产业博览会上&#xff0c;视联动力带来了一系列引人注目的技术和创新应用。 这场为期三天的展览会展示了公司在数字经济发展领域的最新成就&#xff0c;特别是国产通信协议技术方面的进展。 视联动力重点展出了算…

QGraphicsview相关学习

文章学习自&#xff1a; Qt_绘图框架_QGraphicsview实现缩放移动图片_Livy0123的博客-CSDN博客 这里进行一些自己的分析和理解。 (1) 自定义类MyGraphicsView继承自QGraphicsView 核心是重定义的滚轮事件。 [virtual protected] void QGraphicsView::wheelEvent(QWheelEve…

《python语言程序设计》第8章第11题将反向字符串 编写一个函数反向一个字符串,reverse(s)

def reverse(text_arrange):len_text len(text_arrange)dec_text ""for i in range(1, len_text 1):# print(i)dec_text text_arrange[-i]print(f"反向输出{dec_text}")reverse("12345678") reverse("abcdefg")

每日刷题(图论)

P1119 灾后重建 P1119 灾后重建 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路 看数据范围知道需要用到Floyd算法&#xff0c;但是道路是不能直接用的&#xff0c;需要等到连接道路的两个村庄重建好才可以使用&#xff0c;所以这需要按照时间依次加入中转点&#xff0c…

微信小程序接入客服功能

前言 用户可使用小程序客服消息功能&#xff0c;与小程序的客服人员进行沟通。客服功能主要用于在小程序内 用户与客服直接沟通用&#xff0c;本篇介绍客服功能的基础开发以及进阶功能的使用&#xff0c;另外介绍多种客服的对接方式。 更多介绍请查看客服消息使用指南 客服视…

城市智慧公厕建设,提高市民使用体验,提升城市形象

随着智慧城市的建设步伐不断加快&#xff0c;智慧公厕作为城市公共服务设施的重要组成部分&#xff0c;正逐渐成为提升市民生活质量和城市形象的关键环节。智慧公厕不仅通过一系列先进的软硬件技术改善了市民的如厕体验&#xff0c;还提升了城市的管理水平和文明程度。本文将详…

利用深度学习实现验证码识别-3-ResNet18

在当今数字化时代&#xff0c;验证码作为一种重要的安全验证手段&#xff0c;广泛应用于各种网络场景。然而&#xff0c;传统的验证码识别方法往往效率低下&#xff0c;准确率不高。今天&#xff0c;我们将介绍一种基于 ResNet18 的验证码识别方法&#xff0c;它能够高效、准确…

Canvas绘制线条时断断续续的

解决线条断断续续的关键代码如下&#xff1a; 我们可以使用quadraticCurveTo来实现贝塞尔曲线使其变成光滑的曲线 注意&#xff1a; ctx.value.lineCap "round"; ctx.value.lineJoin "round"; 这两个属性是必须设置的 lastX&#xff0c;…

域名是什么

在这个数字世界中&#xff0c;域名无疑是连接用户与网站的关键纽带。域名&#xff0c;是由一串字符组成的地址&#xff0c;用于在互联网上唯一标识和定位一个特定的资源。本文将深入探讨域名的概念、作用以及对互联网发展的重要性。 一、域名的定义与结构 域名可以看作是互联网…

MySQL第10讲--约束的介绍

文章目录 前言约束约束的演示 外键约束删除外键外键删除/更新行为 前言 在第9讲MySQL第9讲–函数的介绍中我们主要介绍了几种mysql的内置函数&#xff1a;字符串函数、数值函数、流程函数、日期函数&#xff0c;并对这些函数中常用的几种函数做了总结&#xff0c;如下图所示&am…

大跨度工业仓储气膜:零排放与消防安全的理想选择—轻空间

在现代工业仓储领域&#xff0c;气膜结构建筑因其独特的优势逐渐受到企业的青睐。它不仅能够提供大跨度的无柱空间&#xff0c;还具备零排放、环保、快速建造、灵活应用等诸多优点&#xff0c;同时满足严格的消防安全要求&#xff0c;是实现高效仓储管理和可持续发展的理想选择…

密钥分发与公钥认证:保障网络通信的安全

在网络通信中&#xff0c;密钥的安全分发和公钥的有效认证是确保系统安全的关键。本文将为基础小白介绍密钥分发与公钥认证的基本概念和实际应用&#xff0c;帮助大家更好地理解这些技术如何保障我们的网络通信安全。 1. 密钥分发与公钥认证的背景 由于密码算法是公开的&…

每天分享一个FPGA开源代码(2)- spi 读写Flash

Flash的用途主要是用于存储主控制器的程序&#xff0c;SPI -Flash芯片就是支持SPI通讯协议的flash芯片。 在FPGA开发中&#xff0c;一般有这两种方式下载程序到板子上&#xff1a; &#xff08;1&#xff09;通过 JTAG下载程序到FPGA中直接运行&#xff0c;下载速度快&#xff…

从误删到重生:2024年数据恢复软件市场新趋势与精选工具

现在科技发展越来越先进&#xff0c;大部分的办公内容也都是通过电脑来进行操作的。但是总免不了偶尔会遇到电脑蓝屏或者其他原因导致数据丢失的情况。那辛辛苦苦做好的材料不见了一定很恼火。这次我分享几个电脑数据恢复工具来解决这个问题。 1.福晰数据恢复 连接直达&#…