mmap系统调用和vmalloc获取地址空间

您所在的位置:网站首页 mmap映射物理地址 mmap系统调用和vmalloc获取地址空间

mmap系统调用和vmalloc获取地址空间

#mmap系统调用和vmalloc获取地址空间| 来源: 网络整理| 查看: 265

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次 阅读 W632GG6NB09JW632GG6NB-11W632GG6NB11I华邦内存芯片 C语言常见内存错误及解决方法   本文将带您了解一些良好的和内存相关的编码实践,以将内存错误保持在控制范围内。内存错误是 C 和 .... 的头像 硬件攻城狮 发表于 02-14 13:10 • 417次 阅读 C语言在STM32中的内存分配   num_byte、num_word、num_byte_static和point_heap存储在内.... 的头像 硬件攻城狮 发表于 02-10 14:57 • 483次 阅读 C语言在STM32中的内存分配 STM32 内存分配解析及变量的存储位置 在一些桌面程序中,整个内存映射是通过虚拟内存来进行管理的,使用一种称为内存管理单元(MMU)的硬件结.... 发表于 02-09 10:41 • 28次 阅读 STM32 内存分配解析及变量的存储位置 单片机的内存分配(变量的存储位置)详解 要了解 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次 阅读 下一代通用内存会是ULTRARAM吗? 学习笔记(08):单片机到底是个什么东西-1.2.第1季第2部分-1.2.6.外设与内部外设 本课程是《朱有鹏老师单片机完全学习系列课程》第1季第2个课程,用通俗易懂的语言讲了很多和单片机有关的.... 发表于 01-18 11:14 • 43次 阅读 学习笔记(08):单片机到底是个什么东西-1.2.第1季第2部分-1.2.6.外设与内部外设 STM32学习笔记 | 引起电源和系统异常复位的原因 关注+星标公众号,不错过精彩内容每一块处理器都有复位的功能,不同处理器复位的类型可能有差异,引起复位.... 发表于 01-17 12:45 • 45次 阅读 STM32学习笔记 | 引起电源和系统异常复位的原因 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次 阅读 【STM32F103笔记】4、中断之外部中断——喂~烧水啦 嵌入式系统优先级详解 关注、星标公众号,不错过精彩内容作者:鱼鹰Osprey微信公众号ID:emOsprey在嵌入式软件开.... 发表于 01-14 15:00 • 60次 阅读 嵌入式系统优先级详解 uC/OS-Ⅲ实时操作系统内核原理总结 学习uC/OS-Ⅲ时做的一些记录,整理了一下,结合自己的理解,做一篇总结(本总结适合有一定的基础的同.... 发表于 01-14 13:03 • 61次 阅读 uC/OS-Ⅲ实时操作系统内核原理总结 容易造成单片机内存溢出的几个陷阱 【摘要】 关于程序变量和内存分配,都是需要我们时刻关注的问题。我相信有不少人在这块犯过很多的错误,也.... 发表于 01-13 15:26 • 48次 阅读 容易造成单片机内存溢出的几个陷阱 精选汇总 | Linux 关注、星标公众号,直达精彩内容来源:技术让梦想更伟大作者:李肖遥 为了大家更加方便的学习并巩固知识.... 发表于 01-13 14:44 • 32次 阅读 精选汇总 | Linux 肝了三个月Linux内核,面试薪资直接翻番,我才明白TA的重要性! 目录一、学习操作系统(Linux内核)的重要性二、Linux内核的组成部分三、Linux内核源码组织.... 发表于 01-13 14:39 • 52次 阅读 肝了三个月Linux内核,面试薪资直接翻番,我才明白TA的重要性! 基于STM32从零写操作系统系列---使用C语言 如有不详细的描述、错误或疑问,欢迎留言!!!基于STM32从零写操作系统系列---前言与目录目的  .... 发表于 01-13 14:05 • 212次 阅读 基于STM32从零写操作系统系列---使用C语言 STM32入门(六)----初识固件库 1-汇编编写的启动文件startup_stm32f10x_hd.s:设置堆栈指针、设置PC指针、初始.... 发表于 01-12 17:20 • 29次 阅读 STM32入门(六)----初识固件库 Android电源键亮灭屏流程 一、整体框架介绍电源键亮灭屏流程从框架上分硬件层,驱动层,Java框架层和Natvie服务层;整个流.... 发表于 01-12 12:08 • 59次 阅读 Android电源键亮灭屏流程 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次 阅读 驱动篇:inux 电源管理的系统架构和驱动(一) PC介绍之PCIE、总线、内存、电源 PC介绍之PCIE、总线、内存、电源PCIE降速PCI-E的总线性能目前我们所使用的显卡是x16 走.... 发表于 01-06 12:42 • 99次 阅读 PC介绍之PCIE、总线、内存、电源 新唐Arm9微处理器的简单介绍 最高可驱动彩色 1024x768 像素并行端口,内建 TFT LCD 控制器与 2D 图形加速器,彩.... 的头像 RTThread物联网操作系统 发表于 01-04 16:15 • 539次 阅读 STM32 初识固件库 野火STM32F103教学视频——初识STM32固件库1.汇编编写的启动文件startup_stm3.... 发表于 01-04 10:45 • 95次 阅读 STM32 初识固件库 DSP为什么具有多个电源呢 你可以去查一下DSP的数据手册,不同的功能需要不同的电压 的头像 工程师邓生 发表于 01-02 12:09 • 409次 阅读 从零开始的STM32F103项目创建+FreeRTOS的最简系统移植 一、所需环境本文使用STM32F103C8T6这款中端使用比较多的Cortex-M3内核MCU编译环.... 发表于 12-31 19:36 • 62次 阅读 从零开始的STM32F103项目创建+FreeRTOS的最简系统移植 【STM32】STM32标准库与HAL库对照学习教程一--使用寄存器操控LED闪烁详讲 【STM32】STM32标准库与HAL库对照学习教程一--使用寄存器操控LED闪烁详讲 前言本教程文.... 发表于 12-31 19:17 • 118次 阅读 【STM32】STM32标准库与HAL库对照学习教程一--使用寄存器操控LED闪烁详讲 STM32 低功耗和ADC 低功耗stm32f103xc,stm32f103xd和stm32f103xE增强型产品支持三种低功耗.... 发表于 12-31 19:01 • 54次 阅读 STM32 低功耗和ADC 用单片机控制导弹? 关注、星标公众号,直达精彩内容一、前言二、关于单片机与嵌入式系统之间界定1. 单片机2.嵌入式系统3.... 发表于 12-29 19:35 • 67次 阅读 用单片机控制导弹? STM32学习心得三十六:内存管理实验 记录一下,方便以后翻阅~主要内容:1) 内存管理概述及原理;2)相关实验代码解读。官方资料:《STM.... 发表于 12-29 19:24 • 38次 阅读 STM32学习心得三十六:内存管理实验 Keil升级了,Keil Studio 来了! 点击下方卡片,关注,一起学嵌入式!什么是 keil studio Cloud?本次更新的是 Keil.... 发表于 12-29 19:07 • 118次 阅读 Keil升级了,Keil Studio 来了! 用-nostdlib选项解决undefined reference to `__aeabi_unwind_cpp_pr1' 解决办法:在编译时添加-nostdlib这个编译选项即可解决。%.o : %.S arm-linux.... 发表于 12-28 19:37 • 48次 阅读 用-nostdlib选项解决undefined reference to `__aeabi_unwind_cpp_pr1' 串口屏储存器不够自己扩展怎么操作? 随着串口屏硬件平台的发展,串口屏Flash内存芯片由大容量并口Nand型、全面进化到了小容量SPI .... 发表于 12-28 11:21 • 1130次 阅读 串口屏储存器不够自己扩展怎么操作? 精选汇总 | STM32 关注+星标公众号,不错过精彩内容作者 | strongerHuang微信公众号|嵌入式专栏为了方便大.... 发表于 12-27 18:39 • 33次 阅读 精选汇总 | STM32 STM32开发内核结构         &n.... 发表于 12-24 19:25 • 35次 阅读 STM32开发内核结构


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3