news 2026/3/29 16:46:36

Linux内存映射

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux内存映射

Linux内存映射

一、物理地址空间

物理地址是处理器在系统总线上看到的地址。使用RISC的处理器通常只实现一个物理地址空间,外围设备和物理内存使用统一的物理地址空间。有些处理器架构把分配给外围设备的物理地址区域称为设备内存。

处理器通过外围设备控制器的寄存器访问外围设备,寄存器分为控制寄存器,状态寄存器和数据寄存器三大类。外围设备的寄存器通常被连续编址,处理器对外围设备寄存器编址方式分为两种:

  • I/O映射方式 (I/O-mapped)
  • 内存映射方式 (memory-mapped)

应用程序只能通过虚拟地址访问外围寄存器,内核提供API函数来把外围寄存器的物理地址映射到虚拟地址空间。

ARM64架构(物理地址宽度最大支持48位)分为两种内存类型:

  • 正常内存 (Normal Memory):包括物理内存和只读内存 (ROM);
  • 设备内存 (Device Memory):指分配给外围设备寄存器的物理地址区域。
  • 设备内存共享属性总是外部共享,缓存属性总是不可缓存(必须绕过处理器的缓存)。

两个进程可以使用共享的文件映射实现共享内存。匿名映射通常是私有映射,共享的匿名映射只能出现在父进程和子进程之间。在进程的虚拟地址空间中,代码段和数据段是私有的文件映射,未初始化数据段、堆栈是私有的匿名映射。

修改过的脏页面不会立即更新到文件中,可以调用msync来强制同步写入文件。

二、虚拟内存区域 (VMA) 与数据结构

在Linux内核中,内存管理涉及到几个关键的结构体:task_structmm_structvm_area_struct

  • task_struct: 进程描述符,包含进程的所有信息。
  • mm_struct: 描述进程的内存地址空间。task_struct中有一个指针struct mm_struct *mm指向它。
  • vm_area_struct: 描述虚拟内存区域 (VMA)。mm_struct中有一个指针struct vm_area_struct *mmap指向 VMA 链表。

VMA 是“进程地址空间的一段规则”,页表建立/缺页处理都依赖它(见 mmap.c 的 vma merge/split 逻辑)。

vm_area_struct 源码分析

vm_area_struct结构体定义了虚拟内存区域的属性(参考内核源码注释):

structvm_area_struct{/* The first cache line has the info for VMA tree walking. */// 这两个成员分别用来保存该虚拟内存空间的首地址和末地址后第一个字节的地址。unsignedlongvm_start;/* Our start address within vm_mm. */unsignedlongvm_end;/* The first byte after our end address within vm_mm. *//* linked list of VM areas per task, sorted by address */structvm_area_struct*vm_next,*vm_prev;// 分别VMA链表的前后成员连接操作// 如果采用链表组织化,会影响到它搜索速度问题,解决此问题采用红黑树// 创建一棵红黑树,将VMA作为一个节点加入到红黑树中,这样可以提升搜索速度structrb_nodevm_rb;/* * Largest free memory gap in bytes to the left of this VMA. * Either between this VMA and vma->vm_prev, or between one of the * VMAs below us in the VMA rbtree and its ->vm_prev. This helps * get_unmapped_area find a free area of the right size. */unsignedlongrb_subtree_gap;/* Second cache line starts here. */structmm_struct*vm_mm;// 指向内存描述符,即虚拟内存区域所属的用户虚拟地址空间pgprot_tvm_page_prot;// 保护位,即访问权限/* 标志 */#defineVM_READ0x00000001#defineVM_WRITE0x00000002#defineVM_EXEC0x00000004#defineVM_SHARED0x00000008/* ... */unsignedlongvm_flags;/* 为了支持查询一个文件区间被映射到哪些虚拟内存区域,把一个文件映射到的所有虚拟内存区域加入该文件地址空间结构 address_space的成员i_mmap指向的红黑树 */struct{structrb_noderb;unsignedlongrb_subtree_last;}shared;/* * A file's MAP_PRIVATE vma can be in both i_mmap tree and anon_vma * list, after a COW of one of the file pages. A MAP_SHARED vma * can only be in the i_mmap tree. An anonymous MAP_PRIVATE, stack * or brk vma (with NULL file) can only be in an anon_vma list. */// 把虚拟内存区域关联的所有anon_vma实例串联起来,一个虚拟内存区域会关联到父进程的anon_vma实例和自己的anon_vma实例structlist_headanon_vma_chain;// 指向一个anon_vma实例,结构anon_vma用来组织匿名页被映射到的所有的虚拟地址空间structanon_vma*anon_vma;/* Serialized by page_table_lock *//* * 虚拟内存操作集合 */conststructvm_operations_struct*vm_ops;/* Information about our backing store: */unsignedlongvm_pgoff;// 文件偏移,单位是页structfile*vm_file;// 文件,如果是私有的匿名映射,该成员是空指针。void*vm_private_data;// 指向内存区的私有数据};

文件映射与虚拟内存区域的关系

文件映射通常涉及以下结构:

  1. vm_area_struct: 代表一段虚拟地址范围。
  2. vm_operations_struct: 包含针对该VMA的操作函数,如open,close,fault(缺页异常处理),page_mkwrite(通知系统即将变为可写) 等。
  3. file: 打开的文件实例。
  4. inode: 文件索引节点。

当进行文件映射时:

  • vm_area_struct中的vm_file指向struct file
  • struct file指向struct inode
  • vm_area_struct中的vm_ops指向文件系统提供的操作函数集。

三、系统调用与mmap原理

应用程序通常使用C标准库提供的函数malloc()申请内存。glibc库的内存分配器ptmalloc使用brkmmap向内核以页为单位申请虚拟内存,然后把页划分成小内存块分配给应用程序。

  • 默认的阈值是128kb
  • 如果应用程序申请的内存长度小于阈值,ptmalloc分配器使用brk向内核申请虚拟内存。
  • 否则,ptmalloc分配器使用mmap向内核申请虚拟内存。

应用程序也可以直接使用mmap向内核申请虚拟内存。

mmap内存映射原理三个阶段

  1. 进程启动映射过程:并且在虚拟地址空间中为映射创建虚拟映射区域 (vm_area_struct)。
  2. 调用内核空间的系统调用函数mmap:(不同于用户空间函数),实现文件物理地址和进程虚拟地址的映射关系
  3. 进程发起对这片映射空间的访问:引发缺页异常,实现文件内容到物理内存(主存)的拷贝。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/22 14:14:55

解析ASTM D4169:运输包装性能测试的核心标准有哪些

ASTM D4169 是国际公认的运输集装箱和系统性能测试标准,通过模拟真实分销环境中的各类危险元素,为包装运输性提供统一评估依据。该标准包含多个分配周期(DC),其中 DC4、DC6、DC12、DC13 是医疗行业界最常选用的周期&am…

作者头像 李华
网站建设 2026/3/28 8:15:21

网上超市设计与实现信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】

摘要 随着互联网技术的快速发展和电子商务的普及,网上超市逐渐成为消费者购物的主要渠道之一。传统的线下超市面临着租金成本高、管理效率低、客户覆盖面有限等问题,而网上超市能够突破时间和空间的限制,为消费者提供更加便捷的购物体验。同时…

作者头像 李华
网站建设 2026/3/25 6:09:47

基于SpringBoot+Vue的阿博图书馆管理系统管理系统设计与实现【Java+MySQL+MyBatis完整源码】

摘要 随着信息技术的飞速发展,传统图书馆管理模式在效率和服务质量上已无法满足现代用户的需求。图书馆管理系统作为数字化管理的重要工具,能够显著提升图书借阅、归还、查询等业务流程的效率,同时为管理员和用户提供更加便捷的操作体验。阿博…

作者头像 李华
网站建设 2026/3/25 6:22:17

【更新至2024年】1996-2024年各省铁路营业里程数据

【更新至2024年】1996-2024年各省铁路营业里程数据 1、时间:1996-2024年 2、来源:国家统计局、统计年鉴 3、指标:铁路营业里程 4、范围:31省 5、指标解释:铁路营业里程又称营业长度,指投入客货运输正式…

作者头像 李华
网站建设 2026/3/27 14:46:35

Agentic AI提示工程可解释性增强:重要方法与实际应用

Agentic AI提示工程可解释性增强:重要方法与实际应用 一、引入与连接:当AI Agent学会"说清楚" 凌晨2点,急诊室的李医生盯着电脑屏幕上的诊断报告,眉头紧皱。 “患者高烧39℃、咳嗽伴呼吸困难,AI Agent建议诊…

作者头像 李华
网站建设 2026/3/29 1:54:43

滤波前后对比图

% 读取数据 pwr freadbkj(../rmli/rmli.ave, 5902, float32, b);% 原始干涉图数据 phase_complex freadbkj(20091226_20100515.diff, 5902, cpxfloat32, b); cc freadbkj(20091226_20100515.cc, 5902, float32, b);% ADF处理后的干涉图数据 adf_phase_complex freadbkj(200…

作者头像 李华