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阅码场】欢迎添加关注!文章转载请注明出处。
收藏
人收藏
扫一扫,分享给好友
复制链接分享
评论
发布评论请先 登录
相关推荐
有谁知道HarmonyOS内核最重要的结构体是什么呢
答案一定是: LOS_DL_LIST(双向链表),它长这样.typedef struct LOS_DL_LIST {//双向链表,内核最重要结构体&nb...
发表于 03-11 15:09 •
482次
阅读
如何对基于RV1109平台的SPI进行调试呢
如何对基于RV1109平台的SPI进行调试呢?
如何对基于RV1109平台的SPI进行测试呢?
...
发表于 03-10 07:43 •
284次
阅读
RK3288系统的用户默认版本显示开发者选项功能如何去实现呢
RK3288系统的用户默认版本显示开发者选项功能如何去实现呢?...
发表于 03-10 07:33 •
63次
阅读
怎样去替换RK3288系统的默认签名文件呢
怎样去替换RK3288系统的默认签名文件呢?
发表于 03-10 07:07 •
108次
阅读
Linux内核代码修改将为性能测试获8450%提升
Jason Donenfeld 是 WireGuard 的主要开发者,同时他也是 Linux 内核随....
马哥Linux运维 发表于 03-09 14:16 •
142次
阅读
怎样去构建orangePi r1 plus (RK3328)系统呢
怎样去构建orangePi r1 plus (RK3328)系统呢?其过程是怎样的?
...
发表于 03-09 07:41 •
105次
阅读
怎样通过三路PWM输出进行RGB灯调色呢
怎样通过三路PWM输出进行RGB灯调色呢?其原理是什么?...
发表于 03-09 07:01 •
70次
阅读
如何在Ubuntu上开发测试SDK开发环境呢
如何在Ubuntu上开发测试SDK开发环境呢?有哪些测试步骤呢?...
发表于 03-09 06:47 •
73次
阅读
浅谈MCU内核架构发展历史
电子发烧友网报道(文/程文智、李宁远)目前,MCU已经渗透到我们生活的各个领域,几乎很难找到有哪个领....
电子发烧友网 发表于 03-08 10:28 •
318次
阅读
如何对VS-RK3399的recovery模式进行升级呢
如何对VS-RK3399的recovery模式进行升级呢?升级方法是什么?
...
发表于 03-08 09:38 •
1048次
阅读
如何对Firefly-RK3399 Linux内核进行编译呢
如何对Firefly-RK3399 Linux内核进行编译呢?有哪些基本流程?...
发表于 03-08 07:16 •
102次
阅读
uboot如何给linux内核所需要的kernel-dtb呢
基于github上uboot的rkdevelop分支有哪些?
uboot如何给linux内核所需要的kernel-dtb呢?
...
发表于 03-07 08:32 •
1360次
阅读
十铨科技DDR5电竞内存通过认证 闵行区领导莅临雅创电子视察指导
Synology 群晖科技近日正式宣布推出 DiskStation Manager 7.1 Beta....
发表于 03-05 09:15 •
1381次
阅读
基于通用MCU芯片CM32M101的智能门锁方案
随着智能家居的高速发展,作为智慧家庭入口的智能门锁受到了消费者的高度青睐,近几年开始呈现爆发态势。相....
发表于 03-03 10:59 •
22次
阅读
AI时代的新一代内存解决方案
新型冠状病毒肺炎COVID-19不仅加速了数字化转型,也推动了市场对AI的需求以及AI自身的发展。A....
三星半导体和显示官方 发表于 03-02 16:30 •
328次
阅读
瑞萨推出基于RISC-V CPU的RZ/Five通用微处理器(MPU)
全球半导体解决方案供应商瑞萨电子集团(TSE:6723)今日宣布,推出基于64位RISC-V CPU....
发表于 03-02 10:13 •
18次
阅读
中国移动首颗MCU芯片CM32M101A的详细介绍
随着5G的商用,物联网时代正式到来,而芯片作为物联网终端产品的核心,其重要性毋庸置疑。国家战略倡导紧....
发表于 02-26 15:19 •
56次
阅读
STM32F103双重ADC同步规则模式采集实验
双重 ADC 同步规则模式采集实验与多路LCD 波形示波器制作显示,本文展示了STM32 AD ....
pgph 发表于 02-24 10:47 •
292次
阅读
面向数据特征的内存跳表优化技术
摘 要:跳表作为数据库中被广泛采用的索引技术,优点在于可以达到类似折半查找的复杂度O(log(n))....
li1234567890123 发表于 02-24 10:02 •
199次
阅读
W632GG6NB09JW632GG6NB-11W632GG6NB11I华邦内存芯片
W632GG6NB09JW632GG6NB-11W632GG6NB11I华邦内存芯片存储器模组大厂威....
szjinfurong 发表于 02-21 09:19 •
27次
阅读
C语言常见内存错误及解决方法
本文将带您了解一些良好的和内存相关的编码实践,以将内存错误保持在控制范围内。内存错误是 C 和 ....
硬件攻城狮 发表于 02-14 13:10 •
417次
阅读
C语言在STM32中的内存分配
num_byte、num_word、num_byte_static和point_heap存储在内....
硬件攻城狮 发表于 02-10 14:57 •
483次
阅读
STM32 内存分配解析及变量的存储位置
在一些桌面程序中,整个内存映射是通过虚拟内存来进行管理的,使用一种称为内存管理单元(MMU)的硬件结....
发表于 02-09 10:41 •
28次
阅读
单片机的内存分配(变量的存储位置)详解
要了解 ROM(flash)、RAM(sram)启动,首先需要对链接器 Linker 如何分配内存有....
发表于 02-08 17:02 •
41次
阅读
美光科技已批量出货全球首款176层QLC NAND SSD
内存和存储解决方案领先供应商Micron Technology, Inc.(美光科技股份有限公司,纳....
Micron美光科技 发表于 01-27 19:04 •
876次
阅读
seL4内核参考⼿册中⽂翻译版
微内核操作系统SEL4的简介、功能描述
发表于 01-21 09:33 •
40次
阅读
存储器结构分类介绍
根据组成元件的不同,ROM内存可以分类为掩模型只读存储器(MASK ROM)、可编程只读存储器(PR....
我快闭嘴 发表于 01-20 14:09 •
586次
阅读
内存的主要分类有哪些
内存又叫内存储器和主存储器,是计算机的重要部件之一,内存条由内存芯片、电路板、金手指等部分组成。接下....
我快闭嘴 发表于 01-20 13:00 •
2425次
阅读
美光科技发布2021年度“惠及所有人”DEI报告
内存和存储解决方案领先供应商 Micron Technology Inc. (美光科技股份有限公司,....
Micron美光科技 发表于 01-20 11:44 •
653次
阅读
ULTRARAM能否成为下一代通用内存
电子发烧友网报道(文/周凯扬)快速、非易失性、高耐久和低逻辑状态开关能耗,这些特质全部汇聚在一个通用....
电子发烧友网 发表于 01-19 16:10 •
1486次
阅读
下一代通用内存会是ULTRARAM吗?
快速、非易失性、高耐久和低逻辑状态开关能耗,这些特质全部汇聚在一个通用内存上过去被认为是不可能实现的....
E4Life 发表于 01-19 09:43 •
2639次
阅读
学习笔记(08):单片机到底是个什么东西-1.2.第1季第2部分-1.2.6.外设与内部外设
本课程是《朱有鹏老师单片机完全学习系列课程》第1季第2个课程,用通俗易懂的语言讲了很多和单片机有关的....
发表于 01-18 11:14 •
43次
阅读
STM32学习笔记 | 引起电源和系统异常复位的原因
关注+星标公众号,不错过精彩内容每一块处理器都有复位的功能,不同处理器复位的类型可能有差异,引起复位....
发表于 01-17 12:45 •
45次
阅读
iPhone14全系支持120Hz高刷屏
2022年苹果即将推出的iPone14系列一共有四款机型,分别是iPhone14、iPhone14 ....
我快闭嘴 发表于 01-17 11:26 •
3547次
阅读
嵌入式系统优先级详解
来源:公众号【鱼鹰谈单片机】作者:鱼鹰OspreyID :emOsprey在嵌入式软件开发中,我们不....
发表于 01-17 09:29 •
48次
阅读
【STM32F103笔记】4、中断之外部中断——喂~烧水啦
这一篇来说一下单片机或者说所有处理器提高运行效率的方法——中断处理,为什么这么说呢,记得我以前看到过....
发表于 01-14 15:45 •
34次
阅读
嵌入式系统优先级详解
关注、星标公众号,不错过精彩内容作者:鱼鹰Osprey微信公众号ID:emOsprey在嵌入式软件开....
发表于 01-14 15:00 •
60次
阅读
uC/OS-Ⅲ实时操作系统内核原理总结
学习uC/OS-Ⅲ时做的一些记录,整理了一下,结合自己的理解,做一篇总结(本总结适合有一定的基础的同....
发表于 01-14 13:03 •
61次
阅读
容易造成单片机内存溢出的几个陷阱
【摘要】 关于程序变量和内存分配,都是需要我们时刻关注的问题。我相信有不少人在这块犯过很多的错误,也....
发表于 01-13 15:26 •
48次
阅读
精选汇总 | Linux
关注、星标公众号,直达精彩内容来源:技术让梦想更伟大作者:李肖遥 为了大家更加方便的学习并巩固知识....
发表于 01-13 14:44 •
32次
阅读
肝了三个月Linux内核,面试薪资直接翻番,我才明白TA的重要性!
目录一、学习操作系统(Linux内核)的重要性二、Linux内核的组成部分三、Linux内核源码组织....
发表于 01-13 14:39 •
52次
阅读
基于STM32从零写操作系统系列---使用C语言
如有不详细的描述、错误或疑问,欢迎留言!!!基于STM32从零写操作系统系列---前言与目录目的 ....
发表于 01-13 14:05 •
212次
阅读
STM32入门(六)----初识固件库
1-汇编编写的启动文件startup_stm32f10x_hd.s:设置堆栈指针、设置PC指针、初始....
发表于 01-12 17:20 •
29次
阅读
Android电源键亮灭屏流程
一、整体框架介绍电源键亮灭屏流程从框架上分硬件层,驱动层,Java框架层和Natvie服务层;整个流....
发表于 01-12 12:08 •
59次
阅读
Z-Wave 800 SiP模块亮点规格及功能特性
Z-Wave 800系列解决方案中的ZGM230S无线模块是一款用于 Z-Wave网状网络连接的系统....
SiliconLabs 发表于 01-11 17:17 •
498次
阅读
驱动篇:inux 电源管理的系统架构和驱动(一)
驱动篇:inux 电源管理的系统架构和驱动(一)Linux 电源管理的全局架构Linux 在消费电子....
发表于 01-11 16:03 •
88次
阅读
PC介绍之PCIE、总线、内存、电源
PC介绍之PCIE、总线、内存、电源PCIE降速PCI-E的总线性能目前我们所使用的显卡是x16 走....
发表于 01-06 12:42 •
99次
阅读
新唐Arm9微处理器的简单介绍
最高可驱动彩色 1024x768 像素并行端口,内建 TFT LCD 控制器与 2D 图形加速器,彩....
RTThread物联网操作系统 发表于 01-04 16:15 •
539次
阅读
STM32 初识固件库
野火STM32F103教学视频——初识STM32固件库1.汇编编写的启动文件startup_stm3....
发表于 01-04 10:45 •
95次
阅读
DSP为什么具有多个电源呢
你可以去查一下DSP的数据手册,不同的功能需要不同的电压
工程师邓生 发表于 01-02 12:09 •
409次
阅读
从零开始的STM32F103项目创建+FreeRTOS的最简系统移植
一、所需环境本文使用STM32F103C8T6这款中端使用比较多的Cortex-M3内核MCU编译环....
发表于 12-31 19:36 •
62次
阅读
【STM32】STM32标准库与HAL库对照学习教程一--使用寄存器操控LED闪烁详讲
【STM32】STM32标准库与HAL库对照学习教程一--使用寄存器操控LED闪烁详讲 前言本教程文....
发表于 12-31 19:17 •
118次
阅读
STM32 低功耗和ADC
低功耗stm32f103xc,stm32f103xd和stm32f103xE增强型产品支持三种低功耗....
发表于 12-31 19:01 •
54次
阅读
用单片机控制导弹?
关注、星标公众号,直达精彩内容一、前言二、关于单片机与嵌入式系统之间界定1. 单片机2.嵌入式系统3....
发表于 12-29 19:35 •
67次
阅读
STM32学习心得三十六:内存管理实验
记录一下,方便以后翻阅~主要内容:1) 内存管理概述及原理;2)相关实验代码解读。官方资料:《STM....
发表于 12-29 19:24 •
38次
阅读
Keil升级了,Keil Studio 来了!
点击下方卡片,关注,一起学嵌入式!什么是 keil studio Cloud?本次更新的是 Keil....
发表于 12-29 19:07 •
118次
阅读
用-nostdlib选项解决undefined reference to `__aeabi_unwind_cpp_pr1'
解决办法:在编译时添加-nostdlib这个编译选项即可解决。%.o : %.S arm-linux....
发表于 12-28 19:37 •
48次
阅读
串口屏储存器不够自己扩展怎么操作?
随着串口屏硬件平台的发展,串口屏Flash内存芯片由大容量并口Nand型、全面进化到了小容量SPI ....
发表于 12-28 11:21 •
1130次
阅读
精选汇总 | STM32
关注+星标公众号,不错过精彩内容作者 | strongerHuang微信公众号|嵌入式专栏为了方便大....
发表于 12-27 18:39 •
33次
阅读
STM32开发内核结构
&n....
发表于 12-24 19:25 •
35次
阅读
|