LINUX预留内存的实现
在LINUX应用开发中,可能需要使用连续的物理地址来存储一些数据或者进行DMA操作,但是由于LINUX具备MMU功能,MMU模块会自动的将物理地址与虚拟地址之间建立页表对应关系(但并不是线性对应),用户能访问的只是虚拟地址,虚拟地址上的连续并不一定代表物理地址上的连续。如果需要使用连续的物理地址,就需要进行预留内存,来将一部分内存保留起来,不用做LINUX建立页表使用,也就是说用户程序中是无法直接通过访问虚拟地址来访问预留内存的,而是通过/dev/mem的方式来访问预留内存。
对于LINUX预留内存的方式,要针对LINUX版本进行区分:
1.对于无设备树的LINUX版本,kernel的参数是由uboot直接通过cmdline传递过去的,所以只需要修改uboot传递给kernel的参数就行。
Linux内核启动参数cmdline提供了大量的选项,用来设置内核启动的参数和配置。其中“mem”选项就是用来限制内核可以看到的系统内存的大小,因此通过设置”mem”参数就能实现保留内存。当”mem”参数指定的size小于系统实际可用的物理内存大小时,实际系统内存中出去mem指定的剩下部分就是reserved memory。例如如果某个系统有64G物理内存,通过添加mem=48G到kernel command line,就能保留最末尾的(64-48)=16G高端内存
2. 对于有设备树的LINUX版本,kernel的参数是通过设备树传入的,因此需要修改设备树中的内容。Devicetree 提供了两种方式预留内存:
reserved-memory和memreserve
◎memreserve用法:在设备树dts文件中添加如下代码
/memreserve/ 0x40000000 0x01000000
在zynqMP中实现该方法遇到的问题:利用PETALINUX工具来编译镜像时,设备树(dts)是直接由HDF文件生成的,手动去修改dts文件无效,在运行petalinux-build时,手动修改的dts文件会直接被覆盖掉;但是将该语句添加在system-user.dtsi中,编译会出现语法错误,xilinx论坛上关于此方法出现的问题并未解答。
- reserved-memory {
- #address-cells = <1>;
- #size-cells = <1>;
- ranges;
- ipu_cma@90000000 {
- compatible = "shared-dma-pool";
- reg = <0x90000000 0x4000000>;
- reusable;
- status = "okay";
- };
◎reserved-memory用法:在设备树dts文件中添加如下代码
在zynqMP中实现reserved-memory方法,可以参照LINUX内核源码的
linux-xlnx-xilinx-v2017.4\Documentation\devicetree\bindings\reserved-memory.txt有以下几点需要注意:
(1)针对zynq和zynqMP需要区别对待,address-cells与size-cells需要保持与根节点一致,例如在zynqMP中:
compatible = "xlnx,zynqmp";
#address-cells = <2>;
#size-cells = <2>;
那么在设备树中添加reserved-memory节点时,就需要设置为
#address-cells = <2>;
#size-cells = <2>;
如果设置为1,内核将无法预留内存,在zynqMP中已经验证了设置为1时,预留内存失败。
(2)compatible属性一栏,如果是给特定的驱动使用预留的内存,需要加上compatible,例如给CMA使用的内存。但对于通用性的内存使用,不需要添加compatible栏。
(3)no-map是将预留内存设置为不可虚拟地址映射的区域,此处的虚拟地址映射是指利用/dev/mem来访问物理地址的方法,添加no-map属性后,只能直接访问物理地址。
(4)reusable属性是将预留内存设置为操作系统可以使用此区域中的内存拥有该区域的设备驱动程序所需要的限制可以把它收回来。通常这意味着操作系统可以使用该区域存储易失性或缓存的数据。
在system-user.dtsi中添加如下代码,就可以实现预留内存:
- reserved-memory {
- #address-cells = <2>;
- #size-cells = <2>;
- ranges;
- reserved: buffer@0 {
- reg = <0x0 0x30000000 0x0 0x10000000>;
- //将0x30000000-0x40000000总共256M的大小的空间作为预留内存
- };
- };
在命令行中输入:dmesg |grep cma 可以看到如下打印信息:
root@xxx:~# dmesg |grep cma
[ 0.000000] cma: Reserved 256 MiB at 0x0000000020000000
[ 0.000000] Memory: 492900K/1048576K available (6652K kernel code, 472K rwdata, 2008K rodata, 448K init, 336K bss, 293532K reserved, 262144K cma-reserved)
其中预留的内存为:293532K = 286M * 1024 =(256+30)*1024,与前面设置的正好对应起来了
http://www.taodudu.cc/news/show-6893575.html
相关文章:
- VMWare中份额、限制、预留的概念区分
- linux 端口预留,预留端口避免占用ip_local_reserved_ports
- 内存管理之预留内存
- qemu/kvm内存预留
- 杭州公积金修改预留手机号
- sip资源预留
- SAP-MM-预留控制
- [SSD核心技术:FTL 1] 谁“偷“走了固态硬盘的容量? 预留空间 (OP )图文全解
- Precondition资源预留
- 数据库预留字段设计
- 关于预留
- SAP-库存管理-预留
- vector预留空间
- SAP可以创建预留的移动类型
- MB21 预留
- SAP中如何快速理解预留
- K3 Cloud中有关锁库与预留的功能解释
- 转:预留详解
- 记录下MYSQL inner
- awk从入门到入土(21)awk脚本调试
- innerText和innerHTML和innerContent
- JS中的innerHTML,innerText,outerHTML的区别
- Memory is All You Need
- flask报错:“Exception: Unexpected end of template. Jinja was looking for the following tags: 'endfor' ”
- javascript中innerHTML和innerText
- JS中的innerHTML和innerText
- Postgresql源码(85)查询执行——表达式解析器分析(select 1+1如何执行)
- 龟兔赛跑——多线程
- 7-22 龟兔赛跑 (基础编程题目集)C语言
- JAVA龟兔赛跑案例
LINUX预留内存的实现相关推荐
- 内存管理(二)-- linux 预留内存几种方法
日常开发过程可能要预留一段物理内存出来提供特殊场景使用(独占一段内存不被系统所使用). 本文讲解3种预留内存的方法,以及对预留内存的使用. 文章目录 一.memblock方式预留内存 1.1 memb ...
- [内存管理] Linux Reserved Memory 预留内存
目录 前言 预留内存给设备驱动 通过DMA API预留内存 给CMA预留内存 原文地址: Linux Reserved Memory 前言 基于Xilinx Zynq SoC / MPSoC的系统的常 ...
- Linux内存从0到1学习笔记(6.6,物理内存初始化之预留内存)
写在前面 前面的章节中有提到过,memblock分配器会将内存划分为动态管理的内存(保存在memblock的memory type的数组)和静态预留的内存(保存在memblock的reserved t ...
- linux 内核参数 rss,Linux控制内存的内核参数
环境 Red Hat Enterprise Linux (RHEL) 5.x (X86) 在 X86 高内存设备中,当用户进程使用 mlock() 在常规区域分配大量内存时,可重新使用的 lowmem ...
- Linux glibc内存管理:用户态内存分配器——ptmalloc实现原理
文章目录 ptmalloc 设计假设 Arena Chunk Bins 内存分配.释放流程 总结 C++ STL : SGI-STL空间配置器源码剖析 Linux 内存管理 | 物理内存管理:物理内存 ...
- Linux系统诊断-内存基础
简介: Linux系统诊断-内存基础 1. 背景 谈及linux内存,很多时候,我们会关注free,top等基础命令.当系统遇到异常情况时,内存问题的根因追溯,现场诊断时,缺乏深层次的debug能力. ...
- Linux 的内存分页管理
这里是引用来源丨Vamei www.cnblogs.com/vamei/p/9329278.html Linux 的内存分页管理 内存是计算机的主存储器.内存为进程开辟出进程空间,让进程在其中保存数据 ...
- Linux 进程内存布局(一)
Linux 进程内存布局 内存管理是操作系统的核心分部,对于程序员和系统管理员来说都非常重要. 这篇文章中我将以介绍一个运行在x86架构的32位Linux 操作系统上进程为例,介绍进程在执行的时候的内 ...
- 707-详解32位Linux系统内存地址映射
详解32位Linux系统内存地址映射 我们先看一段简单的C程序: 我们先来看一张图: 我们平时所说的x86 32位指的是:80386往后到现在的同一个体系的CPU处理芯片,但是x86这个芯片是从808 ...
最新文章
- Java 生成有序 UUID
- 孤荷凌寒自学python第三十八天初识python的线程控制
- matlab 读取WAV文件
- ubuntu12.04升级后找不到共享目录
- 04 | 深入浅出索引(上)
- mongodb创建用户
- Morphling:云原生部署 AI , 如何把降本做到极致?
- Java集合框架:Arrays工具类
- 父母悄悄给自己买房,我很生气,要怎么调整心态?
- python字符串怎么用_零基础如何使用python处理字符串?
- 史无前例!iPhone 14 Pro曝光:首次8GB RAM
- 14年macmini装双硬盘_19年性价比超高的5款笔记本电脑推荐
- DataTable 深入解析数据源绑定原理之高级篇
- 疫情趋势下,远程控制软件成为刚需,ToDesk or 向日葵,哪一款最好用?
- 暴风影音使用技巧十则
- JAVA各种系统架构图及其简介,分布式中间件技术实战
- EasyExcel实现excel导出【设置自定义样式--案例分析】
- 方根法公式_Excel怎么对一个数开n次方根 Excel开方方法汇总
- 强烈推荐一个上网以来见过的最好的学习资料网站,全部免费!
- 5、区域特征分析和区域提取