深入解析Linux分页机制:从虚拟内存到物理地址的魔法转换

目录

引言:为什么需要分页机制?

一、分页机制基础概念

1.1 虚拟地址与物理地址

1.2 页与页框

1.3 为什么是4KB?

二、多级页表结构

2.1 为什么需要多级页表?

2.2 x86_64的四级页表结构

2.3 页表项详解

三、Linux分页实现机制

3.1 内核中的页表管理数据结构

3.2 地址转换过程

 3.3 缺页异常处理

四、高级话题与优化技术

4.1 大页(Huge Page)支持

4.2 反向映射(Reverse Mapping)

4.3 页缓存(Page Cache)与分页

五、性能考量与调优

5.1 TLB优化

5.2 页表遍历优化

5.3 监控与调优工具

六、未来趋势

结语


引言:为什么需要分页机制?

        在现代操作系统中,分页机制(Paging)是实现虚拟内存的核心技术。它创造了一个美妙的幻觉——让每个进程都认为自己拥有完整的、连续的地址空间,而实际上物理内存可能分散且有限。Linux作为现代操作系统的典范,其分页机制的实现既遵循硬件规范,又融入了许多精妙的设计。 本文将带你深入Linux分页机制的世界,从基本概念到实现细节,最后探讨一些高级话题和优化技术。

一、分页机制基础概念

1.1 虚拟地址与物理地址

  • 虚拟地址 (Virtual Address):进程看到的地址空间

  • 物理地址 (Physical Address):实际RAM中的地址

  • 地址转换:通过MMU(内存管理单元)将虚拟地址转换为物理地址

1.2 页与页框

  • 页 (Page):虚拟内存中的固定大小块(通常4KB)

  • 页框 (Page Frame):物理内存中的对应块

  • 页表 (Page Table):记录虚拟页到物理页框映射关系的数据结构

1.3 为什么是4KB?

        Linux默认使用4KB页大小,这是历史与现实权衡的结果:

  • 较小的页:减少内部碎片,但增加页表大小
  • 较大的页:减少TLB压力,但增加浪费
  • 现代Linux也支持大页(2MB、1GB等)

二、多级页表结构

2.1 为什么需要多级页表?

        32位系统下4GB地址空间,4KB页大小:

  • 需要2^20个页表项!
  • 连续存储需要4MB内存(每个进程!)
  • 多级页表可以稀疏存储,节省空间

2.2 x86_64的四级页表结构

        现代x86_64架构使用四级页表:

(1)、PGD (Page Global Directory) 

(2)、P4D (Page 4th Directory) 

(3)、PUD (Page Upper Directory) 

(4)、PMD (Page Middle Directory) 

(5)、PTE (Page Table Entry)

ext 复制 下载  虚拟地址分解:
+--------+--------+--------+--------+--------+
| PGD    | P4D    | PUD    | PMD    | PTE    | Offset |
+--------+--------+--------+--------+--------+

2.3 页表项详解

        以x86_64的PTE为例:

        text:

63      52 51    32 31                12 11  9 8 7 6 5 4 3 2 1 0
+---------+-------+---------------------+---+---+---+---+---+---+
| 保留    | PFN   | 物理页框基地址 (40位) | AVL | G | PAT | D | A | PCD | PWT | U | W | P |
+---------+-------+---------------------+---+---+---+---+---+---+

        关键标志位:

  • P (Present): 页是否在内存中
  • W (Writeable): 是否可写
  • U (User): 用户空间可访问
  • D (Dirty): 页是否被修改
  • A (Accessed): 页是否被访问

三、Linux分页实现机制

3.1 内核中的页表管理数据结构

// 页表项
typedef struct { pteval_t pte; } pte_t;// 页中间目录项
typedef struct { pmdval_t pmd; } pmd_t;// 页上级目录项
typedef struct { pudval_t pud; } pud_t;// 页全局目录项
typedef struct { pgdval_t pgd; } pgd_t;

3.2 地址转换过程

        Linux中地址转换的核心函数:

// 将虚拟地址转换为物理地址的核心流程
pgd_t *pgd = pgd_offset(mm, address);
p4d_t *p4d = p4d_offset(pgd, address);
pud_t *pud = pud_offset(p4d, address);
pmd_t *pmd = pmd_offset(pud, address);
pte_t *pte = pte_offset_map(pmd, address);

 3.3 缺页异常处理

        当访问的页不在内存中(P=0)或权限不足时,触发缺页异常:

// 缺页异常处理主要流程
handle_mm_fault()→ handle_pte_fault()→ do_anonymous_page()    // 匿名页处理→ do_fault()             // 文件映射处理→ do_swap_page()         // 交换页处理

四、高级话题与优化技术

4.1 大页(Huge Page)支持

  • 为什么需要大页? 减少TLB miss,提高性能
  • 2MB和1GB大页:通过PMD和PUD项的PS标志实现
  • 透明大页(THP):自动将普通页合并为大页

4.2 反向映射(Reverse Mapping)

  • 问题:一个物理页可能被多个进程共享

  • 解决方案:建立从物理页到所有映射此页的PTE的链接

  • 实现:通过anon_vma和anon_vma_chain结构

4.3 页缓存(Page Cache)与分页

  • 文件I/O通过页缓存实现
  • 文件页与匿名页的不同处理方式
  • 交换机制:将不活跃的页换出到磁盘

五、性能考量与调优

5.1 TLB优化

  • TLB刷新代价高:尽可能使用全局页(G标志)
  • TLB shootdown:多核系统中的TLB一致性维护

5.2 页表遍历优化

  • PCID(Process Context ID):减少TLB刷新
  • INVLPG优化:智能的TLB项无效化

5.3 监控与调优工具

  • /proc/meminfo:查看内存使用情况
  • perf:分析TLB性能
  • numastat:NUMA内存分布

六、未来趋势

  • 5级页表:应对更大的地址空间
  • 非易失性内存:新型存储介质带来的改变
  • 异构内存管理:不同类型内存的统一管理

结语

        Linux的分页机制是一个复杂而精妙的系统,它不仅是硬件特性的软件抽象,更是性能与功能平衡的艺术。理解这一机制,不仅能帮助我们更好地理解Linux内存管理,还能为系统调优和内核开发打下坚实基础。 正如Linus Torvalds所说:"Memory management is hard." 但正是这种复杂性,成就了Linux强大的内存管理能力。希望本文能为你打开Linux内存管理的大门,让你在探索之路上走得更远。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/news/909286.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用python进行图像处理—图像变换(6)

图像变换是指改变图像的几何形状或空间位置的操作。常见的几何变换包括平移、旋转、缩放、剪切(shear)以及更复杂的仿射变换和透视变换。这些变换在图像配准、图像校正、创建特效等场景中非常有用。 6.1仿射变换(Affine Transformation) 仿射变换是一种…

NLP-数据集介绍(并不全,文本类介绍)

目录 第一章 STS(语义文本相似度) (重点)一、SemEval STS 年度任务(2012-2017)1. SemEval-2012 STS2. SemEval-2013 STS3. SemEval-2014 STS4. SemEval-2015 STS5. SemEval-2016 STS6. SemEval-2017 STS 二…

JS进阶 Day01

1.作用域和作用域链 let不可访问 var可访问,因为没有块作用域这一说法 2.JS垃圾回收机制以及算法 下图如上图同理 下图这个三个相互引用的,根部找不到,就进行清除。 3.JS闭包 4.变量和函数提升(了解) 5.函数剩余参数和展开运算符 还有种写法 …

详解Python当中的pip常用命令

想象一下,如果建造房屋时,每一块砖、每一根钢筋都需要你自己亲手烧制和打造,那会是怎样一番景象?软件开发也是如此。如果没有现成的、高质量的、可复用的代码库,开发者们就不得不重复“发明轮子”,效率低下…

LangChain面试内容整理-知识点10:文本嵌入模型(Embeddings)使用

文本嵌入(Embeddings)是将文字转换为向量(高维数值向量)的过程和结果。在LangChain中,Embeddings模块负责调用各种嵌入模型,将文本转化为向量表示,以便后续在向量空间执行相似度搜索、聚类等操作。这在实现语义搜索、RAG中非常关键,因为向量可以让计算机“理解”文本语…

To be or Not to be, That‘s a Token——论文阅读笔记——Beyond the 80/20 Rule和R2R

本周又在同一方向上刷到两篇文章,可以说,……同学们确实卷啊,要不卷卷开放场域的推理呢? 这两篇都在讲:如何巧妙的利用带有分支能力的token来提高推理性能或效率的。 第一篇叫 Beyond the 80/20 Rule: High-Entropy Mi…

bisheng系列(三)- 本地部署(后端 1.2版本)

一、导读 环境:Ubuntu 24.04、open Euler 23.03、Windows 11、WSL 2、Python 3.10 、bisheng 1.2.0 背景:需要bisheng二开商用,故而此处进行本地部署,便于后期调试开发 时间:20250612 说明:bisheng的1.2…

使用 PolarProxy+Proxifier 解密 TLS 流量

一、简介 在分析恶意样本或加密流量时,我们常常需要将 TLS 加密通信还原为明文。 本文介绍如何通过 PolarProxy 和Proxifier 解密 TLS 流量并保存为 pcap 文件,在 Wireshark 中进行进一步分析。 二、工具准备 ✅ PolarProxy(推荐 Windows x64 版本)✅ Proxifier(强制非浏…

[技术积累]成熟的前端和后端开发框架

1、后端 1.1、低代码开发框架 1.1.1、jeecg 官网:JEECG技术论坛 - 基于BPM的低代码开发平台 1.1.2、APIJSON github官网地址:https://github.com/APIJSON gitee官网地址:https://gitee.com/Tencent/APIJSON 官网地址:腾讯AP…

产品升级 | 新一代高性能数据采集平台BRICK2 X11,助力ADAS与自动驾驶开发

随着ADAS(高级驾驶辅助系统)和自动驾驶(AD)开发中对数据采集与处理的需求日益增长,高性能硬件的重要性愈发凸显。 为此,康谋正式发布了其BRICK系列的最新产品——BRICK2 X11,作为BRICK2的直接升…

蚂蚁集团法人变更:韩歆毅接任,公司治理的正常安排

企查查APP显示,6月11日,蚂蚁科技集团股份有限公司发生工商变更,井贤栋卸任法定代表人,由韩歆毅接任。同时,韩歆毅由董事、总经理变更为执行公司事务的董事、总经理。目前,井贤栋仍担任该公司董事长职务。 接…

2025虚幻游戏逆向工程解包尝试

2025虚幻游戏逆向工程解包 前言 在2025游戏模型提取攻略写了,但是想要找的时候又忘了在哪篇文章中写的,所以干脆专门写一下。中间有许多坑。 一坑接一坑。 先说结论:用Umodel(UV Viewer)查看和导出模型。FModel虽然…

Qt学习及使用_第1部分_认识Qt---Qt开发基本流程

前言 学以致用,通过QT框架的学习,一边实践,一边探索编程的方方面面. 参考书:<Qt 6 C开发指南>(以下称"本书") 标识说明:概念用粗体倾斜.重点内容用(加粗黑体)---重点内容(红字)---重点内容(加粗红字), 本书原话内容用深蓝色标识,比较重要的内容用加粗倾…

大模型的开发应用(十):对话风格微调项目(上):数据工程与模型选型

数据工程 1 项目介绍2 数据工程2.1 申请 API Key 并测试2.2 文本嵌入模型2.3 生成训练集2.3.1 制作风格模板2.3.2 调用大模型获取数据2.3.3 对大模型生成的数据进行质量过滤2.3.4 程序入口 2.4 数据转换 3 模型选型3.1 候选模型与评估数据集3.2 模型评估 附录&#xff08;对比不…

Jmeter压测手册:脚本配置、服务器环境搭建与运行

序 本文记录了我在新公司的首次压测遇到的一些问题以及解决方案。公司服务部署在国外&#xff0c;网络延迟导致的压不上去&#xff0c;需要本地调试脚本&#xff0c;然后用国外服务器压测的过程。同时记录了过程中遇到的一些问题&#xff0c;特别是Jmeter本身占用CPU资源&#…

立定跳远--二分枚举答案+cehck

P10909 [蓝桥杯 2024 国 B] 立定跳远 - 洛谷 #include<bits/stdc.h> using namespace std; #define N 100011 typedef long long ll; typedef pair<int,int> pii; int n,m; int a[N]; int an; bool check(int l) {int pos0;int c1;int wm;for(int i1;i<n;i){if…

蓝桥杯20112 不同的总分值

问题描述 在今年蓝桥杯的决赛中&#xff0c;一共有 10 道题目&#xff0c;每道题目的分数依次为 5 分&#xff0c;5 分&#xff0c;10 分&#xff0c;10 分&#xff0c;15 分&#xff0c;15 分&#xff0c;20 分&#xff0c;20 分&#xff0c;25 分&#xff0c;25 分。 假设某…

[论文阅读] 系统架构 | 零售 IT 中的微服务与实时处理:开源工具链与部署策略综述

零售IT中的微服务与实时处理&#xff1a;开源工具链与部署策略综述 论文信息 Microservices and Real-Time Processing in Retail IT: A Review of Open-Source Toolchains and Deployment Strategies Aaditaa Vashisht (Department of Information Science and Engineering, …

【面板数据】A股上市公司注册地所在地数据集(1991-2023年)

数据简介&#xff1a;上市公司注册地所在地数据指企业在工商行政管理部门登记注册的法定住所信息&#xff0c;涵盖省、市、区三级行政区划及详细地址。该数据是公司法律身份的核心标识&#xff0c;直接影响税务管辖、诉讼归属、政策适用及市场准入等关键环节。更是连接企业行为…

21、Create React App的使用

Create React App 是官方支持的创建单页 React 应用程序的方法。提供了一个现代的构建设置&#xff0c;无需配置。它虽然只是一个包&#xff0c;但不建议全局安装。如果本地安装过可先卸载&#xff0c;这样能保证每次创建项目时使用最新版本的功能。 开始使用 可以使用npx&…