深入解析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
繁體地址,請注明出處:http://hk.pswp.cn/news/909286.shtml
英文地址,請注明出處:http://en.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&…