0

0

Linux系统下进程虚拟地址空间布局及内存映射原理分析

舞夢輝影

舞夢輝影

发布时间:2026-03-17 06:35:10

|

625人浏览过

|

来源于php中文网

原创

Linux进程虚拟地址空间是内核与MMU协同维护的抽象视图,用户空间典型布局含保留区、代码段、数据/BSS段、堆、mmap区和栈;64位下用户空间约256TB,与内核空间严格隔离;mmap通过vma结构实现按需映射;虚实转换依赖多级页表与TLB。

linux系统下进程虚拟地址空间布局及内存映射原理分析

Linux进程的虚拟地址空间不是物理内存的直接复制,而是一套由内核和MMU协同维护的抽象视图。每个进程看到的都是独立、连续、从低到高的地址范围,但背后映射的物理页可能分散、复用甚至尚未分配。

用户空间典型布局(从低地址到高地址)

以64位主流实现为例,用户空间通常覆盖 0x0000000000000000 ~ 0x0000ffffffffffff(约256TB),内部按功能划分为固定语义区域:

  • 保留区(NULL指针陷阱):最低4KB(0x00000000–0x00000fff),禁止映射,访问即触发段错误,用于捕获空指针解引用
  • 代码段(.text):只读、可执行,来自可执行文件或共享库的指令部分;多个进程可共享同一份物理页
  • 数据段(.data)与BSS段(.bss):存放已初始化/未初始化的全局和静态变量;.data内容来自文件,.bss不占磁盘空间,启动时由内核清零
  • 堆(Heap):从.data/.bss末尾向上增长,由brk/sbrk或mmap管理,malloc/free在此区域分配释放内存
  • 内存映射区(mmap area):位于堆与栈之间,用于动态库加载、mmap文件映射、匿名映射、线程栈等;支持灵活权限设置(如PROT_EXEC、PROT_WRITE)
  • 栈(Stack):从高地址向下增长,保存函数调用帧、局部变量、返回地址;每个线程有独立栈,大小受ulimit限制

内核空间与用户空间隔离机制

用户空间与内核空间在虚拟地址上严格分离:

Veo
Veo

Google 最新发布的 AI 视频生成模型

下载
  • 32位系统:用户空间占0–3GB(0x00000000–0xbfffffff),内核空间固定占3–4GB(0xc0000000–0xffffffff)
  • 64位系统:用户空间通常为低128TB或256TB(具体取决于内核配置与架构),剩余高位地址专供内核使用
  • 切换依赖特权级(ring 3 → ring 0):用户态无法直接读写内核空间地址,系统调用、中断、异常会触发CPU模式切换并跳转至内核向量表
  • 页表隔离:每个进程有独立页表(CR3寄存器指向),内核页表项仅在内核态有效,用户态访问会触发页错误

mmap内存映射的核心原理

mmap不是简单“把文件读进内存”,而是建立虚拟地址与后端资源的关联关系,实际物理页按需分配:

  • 创建vm_area_struct:调用mmap()时,内核在进程地址空间中预留一段虚拟区间,并初始化一个vm_area_struct结构,记录起始/结束地址、权限、映射类型(文件 or 匿名)、偏移等
  • 延迟分配物理页(缺页异常驱动):首次访问该虚拟页时触发缺页异常;内核检查vma结构,决定后续动作——文件映射则从磁盘读取对应块到物理页,匿名映射则分配清零页并建立映射
  • 映射类型决定行为
    • 私有映射(MAP_PRIVATE):写操作触发写时复制(COW),不影响源文件或其他进程
    • 共享映射(MAP_SHARED):写操作直接更新物理页,若为文件映射,修改最终同步回文件(msync控制时机)
  • 用途广泛:不仅用于文件I/O加速,还支撑动态链接库加载、进程间共享内存(shm_open + mmap)、大块内存分配(替代brk)、设备寄存器映射等

虚拟地址到物理地址的转换过程

该过程由MMU硬件自动完成,依赖多级页表(x86_64常用4级:PGD→PUD→PMD→PTE):

  • CPU发出虚拟地址,MMU按页目录索引逐级查表,最终获得物理页框号(PFN)与页内偏移组合成物理地址
  • 页表项含标志位:Present(是否已映射)、User/Supervisor(用户态能否访问)、Read/Write/Execute(权限)、Dirty(是否被写过)、Accessed(是否被访问过)
  • TLB(Translation Lookaside Buffer)缓存热点页表项,避免每次访问都查多级表;上下文切换时需刷新或打标
  • 内核通过alloc_pages、__get_free_page等接口分配物理页,并调用set_pte更新页表项,完成虚实绑定

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

255

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1153

2024.03.01

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

2008

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

681

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2440

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

49

2026.01.19

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

448

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

606

2023.08.10

chatgpt使用指南
chatgpt使用指南

本专题整合了chatgpt使用教程、新手使用说明等等相关内容,阅读专题下面的文章了解更多详细内容。

0

2026.03.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 10.8万人学习

Git 教程
Git 教程

共21课时 | 4.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号