兩級(jí)頁表如何實(shí)現(xiàn)地址轉(zhuǎn)換:
- 頁表:是一種特殊的數(shù)據(jù)結(jié)構(gòu),記錄著頁面和頁框的對(duì)應(yīng)關(guān)系。(映射表)
- 頁表的作用:是內(nèi)存非連續(xù)分區(qū)分配的基礎(chǔ),實(shí)現(xiàn)從邏輯地址轉(zhuǎn)化成物理地址。

- (1) 按照地址結(jié)構(gòu)將邏輯地址拆成三個(gè)部分。
- (2) 從PCB中讀取頁目錄起始地址,再根據(jù)一級(jí)頁號(hào)查頁目錄表,找到下一級(jí)頁表在內(nèi)存中存放位置。
- (3) 根據(jù)二級(jí)頁號(hào)查表,找到最終想要訪問的內(nèi)存塊號(hào)。
- (4) 結(jié)合頁內(nèi)偏移量得到物理地址。
虛擬存儲(chǔ)技術(shù)
再解決了頁必須連續(xù)存放的問題后,再看如何第二個(gè)問題:沒有必要讓整個(gè)頁表常駐內(nèi)存,因?yàn)檫M(jìn)程一段時(shí)間內(nèi)可能只需要訪問某幾個(gè)特定的頁面。
解決方案:可以在需要訪問頁面時(shí)才把頁面調(diào)入內(nèi)存——虛擬存儲(chǔ)技術(shù)(后面再說)。可以在頁表中增加一個(gè)標(biāo)示位,用于表示該頁表是否已經(jīng)調(diào)入內(nèi)存。
應(yīng)用
若采用多級(jí)頁表機(jī)制,則各級(jí)頁表的大小不能超過一個(gè)頁面。
舉例說明,某系統(tǒng)按字節(jié)編址,采用40位邏輯地址,頁面大小為4KB,頁表項(xiàng)大小為4B,假設(shè)采用純頁式存儲(chǔ),則要采用()級(jí)頁表,頁內(nèi)偏移量為()位?
頁面大小 = 4KB,按字節(jié)編址,因此頁內(nèi)偏移量為12位。
頁號(hào) = 40 - 12 = 28位。
頁面大小 = 4KB,頁表項(xiàng)大小 = 4B,則每個(gè)頁面可存放1024個(gè)頁表項(xiàng)。因此各級(jí)頁表最多包含1024個(gè)頁表項(xiàng),需要10個(gè)二進(jìn)制位才能映射到1024個(gè)頁表項(xiàng),因此每級(jí)頁表對(duì)應(yīng)的頁號(hào)應(yīng)為10位二進(jìn)制。共28位的頁號(hào)至少要分為3級(jí)。
1、 進(jìn)程的4G 線性空間被劃分成三個(gè)部分:進(jìn)程空間(0-3G)、內(nèi)核直接映射空間(3G – high_memory)、內(nèi)核動(dòng)態(tài)映射空間(VMALLOC_START - VMALLOC_END)
2、 三個(gè)空間使用同一張頁目錄表,通過 CR3 可找到此頁目錄表。但不同的空間在頁目錄表中頁對(duì)應(yīng)不同的項(xiàng),因此互相不沖突
3、 內(nèi)核初始化以后,根據(jù)實(shí)際物理內(nèi)存的大小,計(jì)算出 high_memory、VMALLOC_START、VMALLOC_END 的值。并為“內(nèi)核直接映射”空間建立好映射關(guān)系,所有的物理內(nèi)存都可以通過此空間進(jìn)行訪問。
4、 “進(jìn)程空間”和“內(nèi)核動(dòng)態(tài)映射空間”的映射關(guān)系是動(dòng)態(tài)建立的(通過缺頁異常)
假設(shè)在有三個(gè)線性地址 addr1, addr2, addr3 ,分別屬于三個(gè)線性空間不同部分(0-3G、3G-high_memory、vmalloc_start-vmalloc_end),但是最終都映射到物理頁面1:
1、 三個(gè)地址對(duì)應(yīng)不同的頁表和頁表項(xiàng)
2、 但是頁表項(xiàng)的高 20bit 肯定是1,表示物理頁面的索引號(hào)是1
3、 同時(shí),根據(jù)高 20 bit,可以從 mem_map[] 中找到對(duì)應(yīng)的 struct page 結(jié)構(gòu),struct page 用于管理實(shí)際的物理頁面(就是實(shí)際物理頁面的物理地址了,到這里就不繞彎子了,順便想到高速緩沖的匹配命中操作是用哈希表,換算出的要訪問的實(shí)際物理地址拿到哈希表的輸入計(jì)算一下哈希值,看看有沒命中)(紅線)
4、 從線性地址最終的,根據(jù)頁目錄表,頁表,可以找到物理地址
5、 Struct page 和物理地址之間很容易互相轉(zhuǎn)換
6、 從物理地址,可以很容易的反推出在內(nèi)核直接映射空間的線性地址(藍(lán)線)。要想得到在進(jìn)程空間或者內(nèi)核動(dòng)態(tài)映射空間的對(duì)應(yīng)的線性地址,則需要遍歷相應(yīng)的“虛存區(qū)間”鏈表。
關(guān)于頁目錄表:
1、 每個(gè)進(jìn)程有一個(gè)屬于自己的頁目錄表,可通過 CR3 寄存器找到
2、 而內(nèi)核也有一個(gè)獨(dú)立于其它進(jìn)程的頁目錄表,保存在 swapper_pg_dir[] 數(shù)組中
3、 當(dāng)進(jìn)程切換的時(shí)候,只需要將新進(jìn)程的頁目錄把地址加載到 CR3 寄存器中即可
4、 創(chuàng)建一個(gè)新進(jìn)程的時(shí)候,需要為它分配一個(gè) page,作為頁目錄表,并將 swapper_pg_dir[] 的高 256 項(xiàng)拷貝過來,低 768 項(xiàng)則清0
linux0.11版本,所有進(jìn)程共享同一個(gè)頁目錄而各自使用不同的頁表,該共享的頁目錄就放在物理地址最前面的4k

標(biāo)題:Linux系統(tǒng)文件頁表目錄和頁表結(jié)構(gòu)(圖文詳解)
原文作者:玩轉(zhuǎn)Linux內(nèi)核,地址:https://zhuanlan.zhihu.com/p/429914858 轉(zhuǎn)載注明來源
-
嵌入式
+關(guān)注
關(guān)注
5178文章
20066瀏覽量
326751 -
內(nèi)核
+關(guān)注
關(guān)注
4文章
1433瀏覽量
42377 -
Linux
+關(guān)注
關(guān)注
88文章
11592瀏覽量
217401
發(fā)布評(píng)論請(qǐng)先 登錄
Linux目錄結(jié)構(gòu)及文件操作
關(guān)于頁表和MMU的問題
Linux系統(tǒng)命令及其使用詳解 _120頁
《Linux設(shè)備驅(qū)動(dòng)開發(fā)詳解》第5章、Linux文件系統(tǒng)與設(shè)備文件系統(tǒng)
linux文件系統(tǒng)基礎(chǔ)
Windows和Linux的區(qū)別以及Linux系統(tǒng)的目錄結(jié)構(gòu)
Linux實(shí)用教程之Linux文件和目錄操作總結(jié)
解析Linux內(nèi)核頁表管理中那些鮮為人知的秘密
Linux中匿名頁的訪問分析
嵌入式Linux開發(fā)之文件系統(tǒng)目錄結(jié)構(gòu)介紹
嵌入式Linux系統(tǒng)編程學(xué)習(xí)之一目錄結(jié)構(gòu)
STM32MP157 Linux系統(tǒng)移植開發(fā)篇7:Linux內(nèi)核目錄結(jié)構(gòu)詳解

詳解Linux系統(tǒng)文件頁表目錄和Linux系統(tǒng)頁表結(jié)構(gòu)
評(píng)論