mmap()系统调用是在用户进程与内核之间共享内存区域的常用方法。我们最近有个程序,需要应用进程能够读取内核驱动获取的数据,经过简单的调研,决定采用mmap方式。实现起来不难,在驱动中注册一个字符设备,实现该设备的mmap()方法即可。但这其中有一点小曲折。
在实现设备的mmap()方法时,需要将物理内存映射到应用程序通过mmap()系统调用传下来的vma中。vma代表的是进程的一段虚拟地址空间。在第一版里,考虑的不全面,利用alloc_pages()将整个内存段申请为一段连续的物理地址空间。然后通过remap_pfn_range()函数将这段连续的物理内存映射到vma中。经过长时间的测试,没有发现问题。直到今天,在部署一个老集群时,遇到了问题。这个集群中有很多老机器,内存只有十多个G,而且长时间运行后产生了大量的内存碎片。从而导致,我们无法获得足够的连续物理内存。没办法,只好重新调整驱动中分配内存的方式,改用vmalloc获取地址空间。
在kernel里,通常有3种申请内存的方式:vmalloc, kmalloc, alloc_pages。kmalloc与alloc_pages类似,均是申请连续的地址空间。而vmalloc则可以申请一段不连续的物理地址空间,并将其映射到连续的线性地址上。每次vmalloc之后,内核会创建一个vm_struct,用以映射分配到的不连续的内存区域。vm_struct类似vma,但是又不是一回事。vma是将物理内存映射到进程的虚拟地址空间。而vm_struct是将物理内存映射到内核的线性地址空间。
既然vmalloc拿到的不是连续的物理内存,那么将这些内存映射到vma时,就不能直接利用remap_pfn_range()了。
此时可以采用两种方法,一种是实现vm_operations_struct的fault()方法,用以在缺页时再映射需要的页。此方法操作起来较为麻烦。
另一种方法是直接使用remap_vmalloc_range()函数。该函数的原型为:
int remap_vmalloc_range(struct vm_area_struct *vma, void *addr,unsigned long pgoff)
其中参数vma是mmap使用调用传下来的,addr即为vmalloc()所分配内存的起始地址。而pgoff则为mmap()系统调用里的偏移参数,可以通过vma->vm_pgoff获得。该函数成功执行后,返回值为0。如果返回值为负数,则说明出错了。通常是由于所传的参数不正确。
需要注意的是,需要映射到用户空间的内存段,不能直接利用vmalloc()分配,而应该使用vmalloc_user()函数。该函数除了分配内存之外,还会将相应的vm_struct结构标记为VM_USERMAP。否则,remap_vmalloc_range将返回错误。
在这个项目中碰到的教训是,永远不要假设系统中一定会有超过一个页的连续物理内存。
不过较新的内核具有compact机制,可以整理内存碎片。但是,目前至少有一大部分机器不支持,或未开启此机制。
原文标题:vmalloc与mmap
文章出处:【微信号:LinuxDev,微信公众号:Linux阅码场】欢迎添加关注!文章转载请注明出处。
收藏
人收藏
扫一扫,分享给好友
复制链接分享
评论
发布评论请先 登录
相关推荐
浅谈ARM处理器的基础知识
我们使用的处理器都有一套架构,比如intel 酷睿 i5 属于X86架构,再比如STM32F0是Co....
strongerHuang 发表于 03-21 10:19 •
104次
阅读
怎样去解决RT-Thread系统长期运行导致内存泄漏的问题呢
系统长期运行,很担心有内存泄漏,在想办法监控,大体的思路如下:
一、包装一下malloc,例如,dbg_malloc();调用该函数,除了...
发表于 03-17 09:40 •
821次
阅读
使用rt_free释放内存时出现to free a bad data block:的错误是为什么?
最近在使用rt_free释放内存时会出现to free a bad data block:的错误。期初怀疑重复释放内存导致,但随着深入测试,发现释放内存...
发表于 03-17 09:24 •
1259次
阅读
致远微电子首款多媒体控制和图像显示应用的高集成度芯片
致远微电子推出的首款多媒体控制和图像显示应用的高集成度芯片,采用ARM9内核架构,具备MPU基础功能....
ZLG致远电子 发表于 03-17 08:08 •
302次
阅读
rt-thread的信号回调函数对内核有何影响呢
前言
信号 signal,并不是线程间同步的信号量 semaphore。后者是线程间同步机制的一种,而前者是线程间异步通信的一种。
官方文...
发表于 03-16 10:14 •
373次
阅读
金士顿DDR5内存通过英特尔内存解决方案_瑞虎8西伯利亚版上市发布
2021年10月9日北京讯,全球存储领袖金士顿宣布,即将推出的DDR5内存已通过英特尔平台认证,这是....
电子魔法师 发表于 03-16 09:23 •
228次
阅读
Kingston FURY成为G2 Esports其官方游戏内存和存储设备供应商
2022年2月3日——Synaptics Incorporated(纳斯达克股票代码:SYNA)今天....
电子魔法师 发表于 03-15 17:29 •
620次
阅读
Synaptics在法国开设无线研发中心_Kingston FURY推出风暴系列DDR5内存
2022年2月23 日– Synaptics Incorporated(纳斯达克股票代码:SYNA)....
电子魔法师 发表于 03-15 17:07 •
601次
阅读
泰克示波器在DDR5内存测试中的应用
世界正经历生成的数据量呈爆发增长之势,随着新技术在更广泛的范围内实现,这一趋势预计将进一步加快。典型....
发表于 03-15 15:48 •
16次
阅读
HDF驱动框架设计汇总分享
什么是驱动开发?
这个看似不是问题的问题却很重要,我们必须需要从这一步开始理清楚,见下图:
HDF 驱动框架探路(一):
...
发表于 03-15 15:31 •
1358次
阅读
gpio和pinctrl子系统的关系与区别
gpio 和 pinctrl 子系统在内核里的使用率非常高,和嵌入式产品的关联非常大。从这两个子系统....
FPGA之家 发表于 03-15 11:40 •
216次
阅读
RT-Thread内核学习资料汇总
1、RT-Thread内核对象管理
对象就像一本本书,如何查找呢?查找对比对象里的成员属性【name】:名字。 对象名称长度可...
发表于 03-15 10:45 •
779次
阅读
BPF系统调用与Tracing类型的BPF程序
既然是提供向内核注入代码的技术,那么安全问题肯定是重中之重。平时防范他人通过漏洞向内核中注入代码,这....
Linux阅码场 发表于 03-14 16:42 •
345次
阅读
一种软件模拟内核复位的方法
说到复位,我们都不会陌生,对于一个MCU系统,复位电路是必不可少的一部分。复位的种类有很多:上电复位....
中颖电子 发表于 03-14 12:04 •
227次
阅读
为什么available_size会超过内存本身的最大值呢
在调试中发现,memp_free() -->调用do_memp_free_pool()-->调用mem_free--rt_free()-->rt_memheap_free(),最后在rt_memheap_free...
发表于 03-14 10:07 •
770次
阅读
mlock如何锁住进程地址空间关联的物理内存
一般用户空间关联的物理页面是按需通过缺页异常的方式分配和调页,当系统物理内存不足时页面回收算法会回收....
Linux阅码场 发表于 03-14 09:36 •
156次
阅读
RT-Thread Studio怎样配置才能加快工程的编译速度呢
RT-Thread Studio添加或者修改组件功能以后需要重新编译整个工程。默认配置的编译选项动不动就需要编译好几分钟时间,不方便...
发表于 03-11 16:57 •
346次
阅读
有谁知道HarmonyOS内核最重要的结构体是什么呢
答案一定是: LOS_DL_LIST(双向链表),它长这样.typedef struct LOS_DL_LIST {//双向链表,内核最重要结构体&nb...
发表于 03-11 15:09 •
1239次
阅读
RK3288系统的用户默认版本显示开发者选项功能如何去实现呢
RK3288系统的用户默认版本显示开发者选项功能如何去实现呢?...
发表于 03-10 07:33 •
550次
阅读
怎样去替换RK3288系统的默认签名文件呢
怎样去替换RK3288系统的默认签名文件呢?
发表于 03-10 07:07 •
611次
阅读
Linux内核代码修改将为性能测试获8450%提升
Jason Donenfeld 是 WireGuard 的主要开发者,同时他也是 Linux 内核随....
马哥Linux运维 发表于 03-09 14:16 •
236次
阅读
浅谈MCU内核架构发展历史
电子发烧友网报道(文/程文智、李宁远)目前,MCU已经渗透到我们生活的各个领域,几乎很难找到有哪个领....
电子发烧友网 发表于 03-08 10:28 •
433次
阅读
十铨科技DDR5电竞内存通过认证 闵行区领导莅临雅创电子视察指导
Synology 群晖科技近日正式宣布推出 DiskStation Manager 7.1 Beta....
发表于 03-05 09:15 •
1397次
阅读
基于通用MCU芯片CM32M101的智能门锁方案
随着智能家居的高速发展,作为智慧家庭入口的智能门锁受到了消费者的高度青睐,近几年开始呈现爆发态势。相....
发表于 03-03 10:59 •
44次
阅读
AI时代的新一代内存解决方案
新型冠状病毒肺炎COVID-19不仅加速了数字化转型,也推动了市场对AI的需求以及AI自身的发展。A....
三星半导体和显示官方 发表于 03-02 16:30 •
410次
阅读
瑞萨推出基于RISC-V CPU的RZ/Five通用微处理器(MPU)
全球半导体解决方案供应商瑞萨电子集团(TSE:6723)今日宣布,推出基于64位RISC-V CPU....
发表于 03-02 10:13 •
28次
阅读
中国移动首颗MCU芯片CM32M101A的详细介绍
随着5G的商用,物联网时代正式到来,而芯片作为物联网终端产品的核心,其重要性毋庸置疑。国家战略倡导紧....
发表于 02-26 15:19 •
94次
阅读
STM32F103双重ADC同步规则模式采集实验
双重 ADC 同步规则模式采集实验与多路LCD 波形示波器制作显示,本文展示了STM32 AD ....
pgph 发表于 02-24 10:47 •
407次
阅读
面向数据特征的内存跳表优化技术
摘 要:跳表作为数据库中被广泛采用的索引技术,优点在于可以达到类似折半查找的复杂度O(log(n))....
li1234567890123 发表于 02-24 10:02 •
238次
阅读
W632GG6NB09JW632GG6NB-11W632GG6NB11I华邦内存芯片
W632GG6NB09JW632GG6NB-11W632GG6NB11I华邦内存芯片存储器模组大厂威....
szjinfurong 发表于 02-21 09:19 •
27次
阅读
C语言常见内存错误及解决方法
本文将带您了解一些良好的和内存相关的编码实践,以将内存错误保持在控制范围内。内存错误是 C 和 ....
硬件攻城狮 发表于 02-14 13:10 •
485次
阅读
C语言在STM32中的内存分配
num_byte、num_word、num_byte_static和point_heap存储在内....
硬件攻城狮 发表于 02-10 14:57 •
522次
阅读
STM32 内存分配解析及变量的存储位置
在一些桌面程序中,整个内存映射是通过虚拟内存来进行管理的,使用一种称为内存管理单元(MMU)的硬件结....
发表于 02-09 10:41 •
40次
阅读
单片机的内存分配(变量的存储位置)详解
要了解 ROM(flash)、RAM(sram)启动,首先需要对链接器 Linker 如何分配内存有....
发表于 02-08 17:02 •
56次
阅读
美光科技已批量出货全球首款176层QLC NAND SSD
内存和存储解决方案领先供应商Micron Technology, Inc.(美光科技股份有限公司,纳....
Micron美光科技 发表于 01-27 19:04 •
922次
阅读
seL4内核参考⼿册中⽂翻译版
微内核操作系统SEL4的简介、功能描述
发表于 01-21 09:33 •
53次
阅读
存储器结构分类介绍
根据组成元件的不同,ROM内存可以分类为掩模型只读存储器(MASK ROM)、可编程只读存储器(PR....
我快闭嘴 发表于 01-20 14:09 •
646次
阅读
内存的主要分类有哪些
内存又叫内存储器和主存储器,是计算机的重要部件之一,内存条由内存芯片、电路板、金手指等部分组成。接下....
我快闭嘴 发表于 01-20 13:00 •
3237次
阅读
美光科技发布2021年度“惠及所有人”DEI报告
内存和存储解决方案领先供应商 Micron Technology Inc. (美光科技股份有限公司,....
Micron美光科技 发表于 01-20 11:44 •
692次
阅读
ULTRARAM能否成为下一代通用内存
电子发烧友网报道(文/周凯扬)快速、非易失性、高耐久和低逻辑状态开关能耗,这些特质全部汇聚在一个通用....
电子发烧友网 发表于 01-19 16:10 •
1522次
阅读
下一代通用内存会是ULTRARAM吗?
快速、非易失性、高耐久和低逻辑状态开关能耗,这些特质全部汇聚在一个通用内存上过去被认为是不可能实现的....
E4Life 发表于 01-19 09:43 •
2703次
阅读
学习笔记(08):单片机到底是个什么东西-1.2.第1季第2部分-1.2.6.外设与内部外设
本课程是《朱有鹏老师单片机完全学习系列课程》第1季第2个课程,用通俗易懂的语言讲了很多和单片机有关的....
发表于 01-18 11:14 •
50次
阅读
STM32学习笔记 | 引起电源和系统异常复位的原因
关注+星标公众号,不错过精彩内容每一块处理器都有复位的功能,不同处理器复位的类型可能有差异,引起复位....
发表于 01-17 12:45 •
53次
阅读
iPhone14全系支持120Hz高刷屏
2022年苹果即将推出的iPone14系列一共有四款机型,分别是iPhone14、iPhone14 ....
我快闭嘴 发表于 01-17 11:26 •
3984次
阅读
嵌入式系统优先级详解
来源:公众号【鱼鹰谈单片机】作者:鱼鹰OspreyID :emOsprey在嵌入式软件开发中,我们不....
发表于 01-17 09:29 •
57次
阅读
【STM32F103笔记】4、中断之外部中断——喂~烧水啦
这一篇来说一下单片机或者说所有处理器提高运行效率的方法——中断处理,为什么这么说呢,记得我以前看到过....
发表于 01-14 15:45 •
42次
阅读
嵌入式系统优先级详解
关注、星标公众号,不错过精彩内容作者:鱼鹰Osprey微信公众号ID:emOsprey在嵌入式软件开....
发表于 01-14 15:00 •
68次
阅读
uC/OS-Ⅲ实时操作系统内核原理总结
学习uC/OS-Ⅲ时做的一些记录,整理了一下,结合自己的理解,做一篇总结(本总结适合有一定的基础的同....
发表于 01-14 13:03 •
71次
阅读
容易造成单片机内存溢出的几个陷阱
【摘要】 关于程序变量和内存分配,都是需要我们时刻关注的问题。我相信有不少人在这块犯过很多的错误,也....
发表于 01-13 15:26 •
53次
阅读
精选汇总 | Linux
关注、星标公众号,直达精彩内容来源:技术让梦想更伟大作者:李肖遥 为了大家更加方便的学习并巩固知识....
发表于 01-13 14:44 •
34次
阅读
肝了三个月Linux内核,面试薪资直接翻番,我才明白TA的重要性!
目录一、学习操作系统(Linux内核)的重要性二、Linux内核的组成部分三、Linux内核源码组织....
发表于 01-13 14:39 •
60次
阅读
基于STM32从零写操作系统系列---使用C语言
如有不详细的描述、错误或疑问,欢迎留言!!!基于STM32从零写操作系统系列---前言与目录目的 ....
发表于 01-13 14:05 •
219次
阅读
STM32入门(六)----初识固件库
1-汇编编写的启动文件startup_stm32f10x_hd.s:设置堆栈指针、设置PC指针、初始....
发表于 01-12 17:20 •
34次
阅读
Android电源键亮灭屏流程
一、整体框架介绍电源键亮灭屏流程从框架上分硬件层,驱动层,Java框架层和Natvie服务层;整个流....
发表于 01-12 12:08 •
72次
阅读
Z-Wave 800 SiP模块亮点规格及功能特性
Z-Wave 800系列解决方案中的ZGM230S无线模块是一款用于 Z-Wave网状网络连接的系统....
SiliconLabs 发表于 01-11 17:17 •
528次
阅读
驱动篇:inux 电源管理的系统架构和驱动(一)
驱动篇:inux 电源管理的系统架构和驱动(一)Linux 电源管理的全局架构Linux 在消费电子....
发表于 01-11 16:03 •
99次
阅读
PC介绍之PCIE、总线、内存、电源
PC介绍之PCIE、总线、内存、电源PCIE降速PCI-E的总线性能目前我们所使用的显卡是x16 走....
发表于 01-06 12:42 •
114次
阅读
新唐Arm9微处理器的简单介绍
最高可驱动彩色 1024x768 像素并行端口,内建 TFT LCD 控制器与 2D 图形加速器,彩....
RTThread物联网操作系统 发表于 01-04 16:15 •
570次
阅读
STM32 初识固件库
野火STM32F103教学视频——初识STM32固件库1.汇编编写的启动文件startup_stm3....
发表于 01-04 10:45 •
101次
阅读
从零开始的STM32F103项目创建+FreeRTOS的最简系统移植
一、所需环境本文使用STM32F103C8T6这款中端使用比较多的Cortex-M3内核MCU编译环....
发表于 12-31 19:36 •
68次
阅读
|