Linux中保留内存(Reserved memory)是指把系统中的一部分内存保留起来,内核不会为它建立页表,一般的应用程序无法访问到这段内存。在板卡调试、内存测试和设备DAM调试的过程中,可以运用这种办法,先验证系统在只有低端内存的情况下能否顺利启动;此外,服务器和存储系统的环境下,也可以用这种方法从大量系统内存中保留出一部分,留给特殊用途使用或者模拟诸如NVDIMM等设备。因此,有必要对Reserved Memory的使用有一定了解。

1.实现保留内存

Linux内核启动参数cmdline提供了大量的选项,用来设置内核启动的参数和配置。其中“mem”选项就是用来限制内核可以看到的系统内存的大小,因此通过设置

”mem”参数就能实现保留内存。当”mem”参数指定的size小于系统实际可用的物理内存大小时,实际系统内存中出去mem指定的剩下部分就是reserved memory。例如如果某个系统有64G物理内存,通过添加mem=48G到kernel command line,就能保留最末尾的(64-48)=16G高端内存。

观察和对比有无mem参数kernel启动后的/proc/iomem、dmesg的输出,可以看到64G的物理内存映射到CPU地址是0x100000000~0xfffffffff,而48G的高端物理内存映射的CPU地址空间地址是:0x100000000~0xbffffffff,因此加上mem=48G后,CPU物理地址0xc00000000~0xFFFFFFFFF对应的从48G到64G的内存就给保留了出来。

2.使用保留内存

由于内核启动的时候都没有为保留内存建立页表,无论是内核提供的kmalloc()还是dma_malloc_coherence()函数,抑或是应用程序的malloc(),realloc()等函数都无法从保留内存申请空间。所以为了访问保留内存,需要使用某种方法建立起user space address到保留内存物理地址的映射。有两中方法可以实现这种映射:

一、基于某些驱动提供的接口的实现

许多设备驱动能把自身特有的物理地址空间映射到内核虚拟地址空间,一些SDK软件包还提供了基于设备驱动的API接口,来实现用户态地址和设备特有物理地址空间的映射。为此,可以参考借鉴这部分代码实现对保留内存的映射。

这种方法的好处是这种映射方式自身能够实现cache/uncache/write combing/writ thourgh等不同级别的cache一致性,它的映射方式和所参考的设备驱动里指定的属性一样。当然,缺点也显而易见,它使得本来和其他设备没有任何关系和瓜葛的reserve memory,使用的时候变得依赖于某种设备驱动以及对应的SDK库文件。

二、基于/dev/mem的实现

众所周知,Linux内核、驱动的实现时充分考虑了机制和规则相分离的原则。/dev/mem就是内核提供给用户把一段物理内存地址映射到用户态空间的机制,该机制主要依赖于mmap()系统调用。该系统调用为从指定的起始地址开始、指定长度的一段内存建立起页表,并且映射到当前程序的空闲的用户态地址空间。

具体的实现可以参考下面的示例代码:

char *vmem = NULL;

//FILE * fp= fopen("/dev/mem", "w+");

int fp = open("/dev/mem", O_RDWR | O_SYNC);

if (fp < 0) {

printf("Open /dev/mem error!\n");

return -1;

}

vmem =  mmap(NULL, LEN, PROT_READ | PROT_WRITE, MAP_SHARED, fp,

RESERVERD_MEM_START);

if (vmem == NULL) {

printf("mmap reserver mem on /dev/mem error!\n");

return -1;

}

这种方法的好处是依赖少,只在user space开发,调试方便,不足指出是较之上面的方法倚赖于/dev/mem驱动的实现,不能保证映射的内存是uncached,而且调用层次深些。

通过以上的分析和比较不难看到,实际开发中最终使用哪一种,需要根据实际的项目要求和资源来选择。

如何linux保留内存,Linux内核中实现保留内存的方法相关推荐

  1. Linux 2.6内核中新的锁机制--RCU [转]

    2005 年 7 月 01 日 本文详细地介绍了 Linux 2.6 内核中新的锁机制 RCU(Read-Copy Update) 的实现机制,使用要求与典型应用. 一. 引言 众所周知,为了保护共享 ...

  2. 在linux内核中操作文件的方法--使用get_fs()和set_fs(KERNEL_DS)

    在linux内核中操作文件的方法--使用get_fs()和set_fs(KERNEL_DS) #include <linux/kernel.h> #include <linux/mo ...

  3. linux英伟达显卡内核不匹配,硬核观察|Linus 破例在 Linux 5.11 内核中允许英伟达显卡驱动加塞...

    Linus 破例在 Linux 5.11 内核中允许英伟达显卡驱动加塞 据 cnbeta 报道,曾因闭源驱动对英伟达爆粗口的 Linus Torvalds,刚刚宣布了 Linux 5.11 内核版本的 ...

  4. Linux 2.6内核中新的锁机制--RCU

    转载自: Linux 2.6内核中新的锁机制--RCU 一. 引言 众所周知,为了保护共享数据,需要一些同步机制,如自旋锁(spinlock),读写锁(rwlock),它们使用起来非常简单,而且是一种 ...

  5. 一种Cortex-M内核中的精确延时方法

    本文介绍一种Cortex-M内核中的精确延时方法 前言 为什么要学习这种延时的方法? 很多时候我们跑操作系统,就一般会占用一个硬件定时器--SysTick,而我们一般操作系统的时钟节拍一般是设置100 ...

  6. linux5.5 dev null,NULL TTY驱动程序将出现在Linux 5.2内核中

    虽然最初在内核邮件列表中首次提出这个驱动程序时,有人对它的实用性和实用性提出了一些问题,但是NULL TTY驱动程序将在即将到来的Linux 5.2内核周期中开始它的主线之旅. NULL TTY驱动程 ...

  7. Linux网络:内核中的网络参数(net.xxx.xxx)

    目录 nf_conntrack bridge-nf 反向路径过滤 TCP相关 ARP相关 ARP回收 ARP过滤 参考文档 nf_conntrack nf_conntrack是Linux内核连接跟踪的 ...

  8. linux去掉文件空行,linux下删除文件中空行的多种方法 互联网技术圈 互联网技术圈...

    源文件: $ cat a.txt baiked.com is a best Linux blog to learn Linux. It's FIVE years old blog. This webs ...

  9. linux学习笔记——gdb中的watch使用方法

    参考链接 参考链接二 先将程序跑起来:1.直接r后再watch 变量名.2.先在观察变量处设置断点,再r至断点处,再watch 变量名. c后程序会跑到变量改变时. 注:watch其实是设置观察断点, ...

最新文章

  1. 小组级git服务器搭建
  2. __clone class php_PHP 对象克隆 clone 关键字与 __clone() 方法
  3. Spring Boot 2.x基础教程:使用Elastic Job的分片配置
  4. Redis 实现延迟队列?深深被折服!!
  5. Transformer源代码解释之PyTorch篇
  6. Jacobian vector products(转载+翻译+代码+解读)
  7. DBA用于查询当前数据库表格记录条数的脚本
  8. anaconda配置虚拟环境
  9. c语言方阵的转置程序,C程序查找矩阵的转置
  10. Golang web filter 轻量级实现
  11. 【Flink】未解决 FLink 写 hive MemoryManager New Memory allocation smaller than the minimum allocation size
  12. 深入浅出 eBPF: (Linux/Kernel/XDP/BCC/BPFTrace/Cillium)
  13. 多个div中的label标签对齐
  14. 一、基础篇--1.1Java基础-包装类的装箱和拆箱
  15. 用LM方法的matlab求解,matlab中LM算法
  16. PHP中如何获取字符串的长度
  17. 基于JSP的美食论坛系统毕业设计
  18. 阿里巴巴国际站之关键词整理
  19. Hexo博客美化之——IP签名图一网打尽
  20. 公众平台 python_微信公众平台SDK Python

热门文章

  1. 技术团队的工程师文化:效率与价值
  2. JAVA 简单的抽奖程序
  3. 制作Ubuntu16.04系统盘
  4. SQL server中的SELECT查询语句执行顺序
  5. 小程序 - 数组追加兼本地存储
  6. 活动目录的灾难恢复操作指导之三
  7. LVM逻辑卷管理命令
  8. 开源分布式搜索平台ELK+Redis+Syslog-ng实现日志实时搜索
  9. Unity3D 渲染统计窗口
  10. nagios-3种报警方式–声音–email/邮件—短信