Linux內核分頁——線性地址結構

每個進程通過一個指針(即進程的mm_struct→pgd)指向其專屬的頁全局目錄(PGD),該目錄本身存儲在一個物理頁框中。這個頁框包含一個類型為pgd_t的數組,該類型是與架構相關的數據結構,定義在<asm/page.h>頭文件中。頁表的加載方式因架構而異:在x86架構中,進程頁表通過將mm_struct→pgd復制到cr3寄存器來加載,這一操作會附帶刷新TLB(事實上,這正是架構相關代碼中flush_tlb()函數的實現原理)。

PGD表中的每個有效表項指向一個物理頁框,其中包含類型為pmd_t的頁中間目錄(PMD)條目數組。每個PMD條目進一步指向另一個頁框,其中包含類型為pte_t的頁表項(PTE),而這些PTE最終指向存儲實際用戶數據的物理頁框。若頁面已被換出到后備存儲,交換條目將存儲在PTE中,并由頁錯誤處理例程do_swap_page()使用,以定位包含頁面數據的交換條目。頁表布局如圖所示。

任意給定的線性地址可被分解為三部分:三個頁表層級內的偏移量以及實際頁面內的偏移量。為輔助地址分解,系統為每個頁表層級提供了一組三元宏定義——SHIFT(XX_SHIFT表示XX段的bit位數)、SIZE(XX_SIZE表示XX段的大小,一般等于2^XX_SHIF)和MASK(XX_MASK表示從線性地址中獲取XX段的掩碼,XX段以外的bit位都是0)。其中,SHIFT宏定義了該層級頁表映射的地址位長度

MASK宏可通過與線性地址進行按位與(AND)操作,屏蔽掉所有高位比特,常用于判斷地址是否在頁表某一層級對齊。SIZE宏則揭示了每個層級的表項所覆蓋的字節范圍。SIZE與MASK宏的關系如圖3.3所示。在這組三元宏中,僅需定義SHIFT值,其余兩者可通過計算得出。例如,x86架構的頁面層級宏定義如下:

#define PAGE_SHIFT??? 12

#define PAGE_SIZE??? (1UL << PAGE_SHIFT)

#define PAGE_MASK??? (~(PAGE_SIZE-1))

其中:

  • PAGE_SHIFT表示線性地址中頁內偏移部分的比特長度(x86為12位)
  • PAGE_SIZE通過2^PAGE_SHIFT計算得出(即頁大小)
  • PAGE_MASK通過對PAGE_SIZE-1取反得到,用于對齊頁邊界時清零偏移位。若需強制地址按頁對齊,可使用PAGE_ALIGN()宏,其原理是先將地址加上PAGE_SIZE-1,再與PAGE_MASK按位與操作以消除頁偏移比特。

類似地:

  • PMD_SHIFT表示頁中間目錄(PMD)層級映射的地址比特數,其對應的PMD_SIZEPMD_MASK通過相同方式計算。
  • PGDIR_SHIFT表示頁全局目錄(PGD)頂層映射的地址比特數,PGDIR_SIZEPGDIR_MASK遵循相同規則。

最后,關鍵的三個宏是PTRS_PER_*系列,它們定義了各層級頁表的表項數量:

  • PTRS_PER_PGD表示PGD中的指針數量(x86無PAE時為1,024)
  • PTRS_PER_PMD對應PMD層(x86無PAE時為1)
  • PTRS_PER_PTE對應底層PTE(x86無PAE時為1,024)

這些宏共同構建了Linux頁表體系的核心尋址機制。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/75459.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/75459.shtml
英文地址,請注明出處:http://en.pswp.cn/web/75459.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

微信小程序開發:微信小程序上線發布與后續維護

微信小程序上線發布與后續維護研究 摘要 微信小程序作為移動互聯網的重要組成部分,其上線發布與后續維護是確保其穩定運行和持續優化的關鍵環節。本文從研究學者的角度出發,詳細探討了微信小程序的上線發布流程、后續維護策略以及數據分析與用戶反饋處理的方法。通過結合實…

分享一些使用DeepSeek的實際案例

文章目錄 前言職場辦公領域生活領域學習教育領域商業領域技術開發領域 前言 以下是一些使用 DeepSeek 的實際案例&#xff1a; DeepSeek使用手冊資源鏈接&#xff1a;https://pan.quark.cn/s/fa502d9eaee1 職場辦公領域 行業競品分析&#xff1a;剛入職的小李被領導要求一天內…

flink iceberg寫數據到hdfs,hive同步讀取

目錄 1、組件版本 環境變量配置 2、hadoop配置 hadoop-env.sh core-site.xml hdfs-site.xml mapred-site.xml yarn-site.xml 3、hive配置 hive-env.sh hive-site.xml HIVE LIB 原始JAR 4、flink配置集成HDFS和YARN 修改iceberg源碼 編譯iceberg-flink-runtime-1…

qq郵箱群發程序

1.界面設計 1.1 環境配置 在外部工具位置進行配置 1.2 UI界面設計 1.2.1 進入QT的UI設計界面 在pycharm中按順序點擊&#xff0c;進入UI編輯界面&#xff1a; 點擊第三步后進入QT的UI設計界面&#xff0c;通過點擊按鈕進行界面設計&#xff0c;設計后進行保存到當前Pycharm…

【C++游戲引擎開發】第10篇:AABB/OBB碰撞檢測

一、AABB(軸對齊包圍盒) 1.1 定義 ?最小點: m i n = ( x min , y min , z min ) \mathbf{min} = (x_{\text{min}}, y_{\text{min}}, z_{\text{min}}) min=(xmin?,ymin?,zmin?)?最大點: m a x = ( x max , y max , z max ) \mathbf{max} = (x_{\text{max}}, y_{\text{…

大模型是如何把向量解碼成文字輸出的

hidden state 向量 當我們把一句話輸入模型后&#xff0c;例如 “Hello world”&#xff1a; token IDs: [15496, 995]經過 Embedding Transformer 層后&#xff0c;會得到每個 token 的中間表示&#xff0c;形狀為&#xff1a; hidden_states: (batch_size, seq_len, hidd…

C++指針(三)

個人主頁:PingdiGuo_guo 收錄專欄&#xff1a;C干貨專欄 文章目錄 前言 1.字符指針 1.1字符指針的概念 1.2字符指針的用處 1.3字符指針的操作 1.3.1定義 1.3.2初始化 1.4字符指針使用注意事項 2.數組參數&#xff0c;指針參數 2.1數組參數 2.1.1數組參數的概念 2.1…

生命篇---心肺復蘇、AED除顫儀使用、海姆立克急救法、常見情況急救簡介

生命篇—心肺復蘇、AED除顫儀使用、海姆立克急救法、常見情況急救簡介 文章目錄 生命篇---心肺復蘇、AED除顫儀使用、海姆立克急救法、常見情況急救簡介一、前言二、急救1、心肺復蘇&#xff08;CPR&#xff09;&#xff08;1&#xff09;適用情況&#xff08;2&#xff09;操作…

基于神經環路的神經調控可增強遺忘型輕度認知障礙患者的延遲回憶能力

簡要總結 這篇文章提出了一種名為CcSi-MHAHGEL的框架&#xff0c;用于基于多站點、多圖譜fMRI的功能連接網絡&#xff08;FCN&#xff09;分析&#xff0c;以輔助自閉癥譜系障礙&#xff08;ASD&#xff09;的識別。該框架通過多視圖超邊感知的超圖嵌入學習方法&#xff0c;整合…

[WUSTCTF2020]level1

關鍵知識點&#xff1a;for匯編 ida64打開&#xff1a; 00400666 55 push rbp .text:0000000000400667 48 89 E5 mov rbp, rsp .text:000000000040066A 48 83 EC 30 sub rsp, 30h .text:000000…

cpp自學 day20(文件操作)

基本概念 程序運行時產生的數據都屬于臨時數據&#xff0c;程序一旦運行結束都會被釋放 通過文件可以將數據持久化 C中對文件操作需要包含頭文件 <fstream> 文件類型分為兩種&#xff1a; 文本文件 - 文件以文本的ASCII碼形式存儲在計算機中二進制文件 - 文件以文本的…

Gartner發布軟件供應鏈安全市場指南:軟件供應鏈安全工具的8個強制功能、9個通用功能及全球29家供應商

攻擊者的目標是由開源和商業軟件依賴項、第三方 API 和 DevOps 工具鏈組成的軟件供應鏈。軟件工程領導者可以使用軟件供應鏈安全工具來保護他們的軟件免受這些攻擊的連鎖影響。 主要發現 越來越多的軟件工程團隊現在負責解決軟件供應鏈安全 (SSCS) 需求。 軟件工件、開發人員身…

備賽藍橋杯-Python-考前突擊

額&#xff0c;&#xff0c;離藍橋杯開賽還有十個小時&#xff0c;最近因為考研復習節奏的問題&#xff0c;把藍橋杯的優先級后置了&#xff0c;突然才想起來還有一個藍橋杯呢。。 到目前為止python基本語法熟練了&#xff0c;再補充一些常用函數供明天考前再背背&#xff0c;算…

榕壹云外賣跑腿系統:基于Spring Boot+MySQL+UniApp的智慧生活服務平臺

項目背景與需求分析 隨著本地生活服務需求的爆發式增長&#xff0c;外賣、跑腿等即時配送服務成為現代都市的剛性需求。傳統平臺存在開發成本高、功能定制受限等問題&#xff0c;中小企業及創業團隊極需一款輕量級、可快速部署且支持二次開發的外賣跑腿系統。榕壹云外賣跑腿系統…

使用Docker安裝Gogs

1、拉取鏡像 docker pull gogs/gogs 2、運行容器 # 創建/var/gogs目錄 mkdir -p /var/gogs# 運行容器 # -d&#xff0c;后臺運行 # -p&#xff0c;端口映射&#xff1a;(宿主機端口:容器端口)->(10022:22)和(10880:3000) # -v&#xff0c;數據卷映射&#xff1a;(宿主機目…

【antd + vue】Modal 對話框:修改彈窗標題樣式、Modal.confirm自定義使用

一、標題樣式 1、目標樣式&#xff1a;修改彈窗標題樣式 2、問題&#xff1a; 直接在對應css文件中修改樣式不生效。 3、原因分析&#xff1a; 可能原因&#xff1a; 選擇器權重不夠&#xff0c;把在控制臺找到的選擇器直接復制下來&#xff0c;如果還不夠就再加&#xff…

Streamlit在測試領域中的應用:構建自動化測試報告生成器

引言 Streamlit 在開發大模型AI測試工具方面具有顯著的重要性&#xff0c;尤其是在簡化開發流程、增強交互性以及促進快速迭代等方面。以下是幾個關鍵點&#xff0c;說明了 Streamlit 對于構建大模型AI測試工具的重要性&#xff1a; 1. 快速原型設計和迭代 對于大模型AI測試…

docker 運行自定義化的服務-后端

docker 運行自定義化的服務-前端-CSDN博客 運行自定義化的后端服務 具體如下&#xff1a; ①打包后端項目&#xff0c;形成jar包 ②編寫dockerfile文件&#xff0c;文件內容如下&#xff1a; # 使用官方 OpenJDK 鏡像 FROM jdk8:1.8LABEL maintainer"ATB" version&…

解決java使用easyexcel填充模版后,高度不一致問題

自定義工具&#xff0c;可以通過獲取上一行行高設置后面所以行的高度 package org.springblade.modules.api.utils;import com.alibaba.excel.write.handler.RowWriteHandler; import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; import com.alibaba.excel.wr…

repo倉庫文件清理

1. repo 倉庫內文件清理 # 清理所有Git倉庫中的項目 repo forall -c git clean -dfx # 重置所有Git 倉庫中的項目 repo forall -c git reset --hard 解釋&#xff1a; repo forall -c git clean -dfx&#xff1a; repo forall 是一個用于在所有項目中執行命令的工具。-c 后…