0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀(guān)看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

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

書(shū)生途 ? 來(lái)源:書(shū)生途 ? 作者:書(shū)生途 ? 2022-05-11 09:22 ? 次閱讀

兩級(jí)頁(yè)表如何實(shí)現(xiàn)地址轉(zhuǎn)換:

  • 頁(yè)表:是一種特殊的數(shù)據(jù)結(jié)構(gòu),記錄著頁(yè)面和頁(yè)框的對(duì)應(yīng)關(guān)系。(映射表)
  • 頁(yè)表的作用:是內(nèi)存非連續(xù)分區(qū)分配的基礎(chǔ),實(shí)現(xiàn)從邏輯地址轉(zhuǎn)化成物理地址。
pYYBAGJ6ZJ2AG2klAACTtTGxTzw118.jpg
  1. (1) 按照地址結(jié)構(gòu)將邏輯地址拆成三個(gè)部分。
  2. (2) 從PCB中讀取頁(yè)目錄起始地址,再根據(jù)一級(jí)頁(yè)號(hào)查頁(yè)目錄表,找到下一級(jí)頁(yè)表在內(nèi)存中存放位置。
  3. (3) 根據(jù)二級(jí)頁(yè)號(hào)查表,找到最終想要訪(fǎng)問(wèn)的內(nèi)存塊號(hào)。
  4. (4) 結(jié)合頁(yè)內(nèi)偏移量得到物理地址。

虛擬存儲(chǔ)技術(shù)

再解決了頁(yè)必須連續(xù)存放的問(wèn)題后,再看如何第二個(gè)問(wèn)題:沒(méi)有必要讓整個(gè)頁(yè)表常駐內(nèi)存,因?yàn)檫M(jìn)程一段時(shí)間內(nèi)可能只需要訪(fǎng)問(wèn)某幾個(gè)特定的頁(yè)面。
解決方案:可以在需要訪(fǎng)問(wèn)頁(yè)面時(shí)才把頁(yè)面調(diào)入內(nèi)存——虛擬存儲(chǔ)技術(shù)(后面再說(shuō))??梢栽陧?yè)表中增加一個(gè)標(biāo)示位,用于表示該頁(yè)表是否已經(jīng)調(diào)入內(nèi)存。

應(yīng)用

若采用多級(jí)頁(yè)表機(jī)制,則各級(jí)頁(yè)表的大小不能超過(guò)一個(gè)頁(yè)面。

舉例說(shuō)明,某系統(tǒng)按字節(jié)編址,采用40位邏輯地址,頁(yè)面大小為4KB,頁(yè)表項(xiàng)大小為4B,假設(shè)采用純頁(yè)式存儲(chǔ),則要采用()級(jí)頁(yè)表,頁(yè)內(nèi)偏移量為()位?

頁(yè)面大小 = 4KB,按字節(jié)編址,因此頁(yè)內(nèi)偏移量為12位。
頁(yè)號(hào) = 40 - 12 = 28位。
頁(yè)面大小 = 4KB,頁(yè)表項(xiàng)大小 = 4B,則每個(gè)頁(yè)面可存放1024個(gè)頁(yè)表項(xiàng)。因此各級(jí)頁(yè)表最多包含1024個(gè)頁(yè)表項(xiàng),需要10個(gè)二進(jìn)制位才能映射到1024個(gè)頁(yè)表項(xiàng),因此每級(jí)頁(yè)表對(duì)應(yīng)的頁(yè)號(hào)應(yīng)為10位二進(jìn)制。共28位的頁(yè)號(hào)至少要分為3級(jí)。

1、 進(jìn)程的4G 線(xiàn)性空間被劃分成三個(gè)部分:進(jìn)程空間(0-3G)、內(nèi)核直接映射空間(3G – high_memory)、內(nèi)核動(dòng)態(tài)映射空間(VMALLOC_START - VMALLOC_END)

2、 三個(gè)空間使用同一張頁(yè)目錄表,通過(guò) CR3 可找到此頁(yè)目錄表。但不同的空間在頁(yè)目錄表中頁(yè)對(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)存都可以通過(guò)此空間進(jìn)行訪(fǎng)問(wèn)。

4、 “進(jìn)程空間”和“內(nèi)核動(dòng)態(tài)映射空間”的映射關(guān)系是動(dòng)態(tài)建立的(通過(guò)缺頁(yè)異常)

假設(shè)在有三個(gè)線(xiàn)性地址 addr1, addr2, addr3 ,分別屬于三個(gè)線(xiàn)性空間不同部分(0-3G、3G-high_memory、vmalloc_start-vmalloc_end),但是最終都映射到物理頁(yè)面1:

1、 三個(gè)地址對(duì)應(yīng)不同的頁(yè)表和頁(yè)表項(xiàng)

2、 但是頁(yè)表項(xiàng)的高 20bit 肯定是1,表示物理頁(yè)面的索引號(hào)是1

3、 同時(shí),根據(jù)高 20 bit,可以從 mem_map[] 中找到對(duì)應(yīng)的 struct page 結(jié)構(gòu),struct page 用于管理實(shí)際的物理頁(yè)面(就是實(shí)際物理頁(yè)面的物理地址了,到這里就不繞彎子了,順便想到高速緩沖的匹配命中操作是用哈希表,換算出的要訪(fǎng)問(wèn)的實(shí)際物理地址拿到哈希表的輸入計(jì)算一下哈希值,看看有沒(méi)命中)(紅線(xiàn))

4、 從線(xiàn)性地址最終的,根據(jù)頁(yè)目錄表,頁(yè)表,可以找到物理地址

5、 Struct page 和物理地址之間很容易互相轉(zhuǎn)換

6、 從物理地址,可以很容易的反推出在內(nèi)核直接映射空間的線(xiàn)性地址(藍(lán)線(xiàn))。要想得到在進(jìn)程空間或者內(nèi)核動(dòng)態(tài)映射空間的對(duì)應(yīng)的線(xiàn)性地址,則需要遍歷相應(yīng)的“虛存區(qū)間”鏈表。


關(guān)于頁(yè)目錄表:
1、 每個(gè)進(jìn)程有一個(gè)屬于自己的頁(yè)目錄表,可通過(guò) CR3 寄存器找到
2、 而內(nèi)核也有一個(gè)獨(dú)立于其它進(jìn)程的頁(yè)目錄表,保存在 swapper_pg_dir[] 數(shù)組中

3、 當(dāng)進(jìn)程切換的時(shí)候,只需要將新進(jìn)程的頁(yè)目錄把地址加載到 CR3 寄存器中即可

4、 創(chuàng)建一個(gè)新進(jìn)程的時(shí)候,需要為它分配一個(gè) page,作為頁(yè)目錄表,并將 swapper_pg_dir[] 的高 256 項(xiàng)拷貝過(guò)來(lái),低 768 項(xiàng)則清0

linux0.11版本,所有進(jìn)程共享同一個(gè)頁(yè)目錄而各自使用不同的頁(yè)表,該共享的頁(yè)目錄就放在物理地址最前面的4k

poYBAGJ6ZJ6AdSSmAACsd8Aievs752.jpg

標(biāo)題:Linux系統(tǒng)文件頁(yè)表目錄和頁(yè)表結(jié)構(gòu)(圖文詳解)

原文作者:玩轉(zhuǎn)Linux內(nèi)核,地址:https://zhuanlan.zhihu.com/p/429914858 轉(zhuǎn)載注明來(lái)源

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5054

    文章

    18917

    瀏覽量

    301018
  • 內(nèi)核
    +關(guān)注

    關(guān)注

    3

    文章

    1351

    瀏覽量

    40160
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11182

    瀏覽量

    208533
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Linux目錄結(jié)構(gòu)文件操作

    Linux目錄結(jié)構(gòu)為樹(shù)狀結(jié)構(gòu),最頂級(jí)的目錄為根目錄/。
    發(fā)表于 09-05 10:15 ?527次閱讀

    關(guān)于頁(yè)和MMU的問(wèn)題

    剛開(kāi)始學(xué),好多東西都云里霧里的TT為什么在bootloader里要進(jìn)行頁(yè)初始化然后開(kāi)啟MMU,然后在進(jìn)入內(nèi)核后還要?jiǎng)?chuàng)建頁(yè)開(kāi)啟MMU?這兩個(gè)有什么不一樣么?s3c2410,bootl
    發(fā)表于 05-06 17:25

    解讀Linux文件系統(tǒng)目錄結(jié)構(gòu)

    通過(guò)命令ls/可以展示Linux系統(tǒng)目錄結(jié)構(gòu),主要包括以下內(nèi)容:1. binbin是Binary的縮寫(xiě), 這個(gè)目錄存放著最經(jīng)常使用的命令。2
    發(fā)表于 01-09 13:38

    詳解Linux目錄結(jié)構(gòu)

    /:根目錄,位于Linux文件系統(tǒng)目錄結(jié)構(gòu)的頂層,一般根目錄下只存放
    發(fā)表于 07-25 07:45

    Linux系統(tǒng)命令及其使用詳解 _120頁(yè)

    電子發(fā)燒友網(wǎng)站提供《Linux系統(tǒng)命令及其使用詳解 _120頁(yè).doc》資料免費(fèi)下載
    發(fā)表于 04-18 13:23 ?3次下載

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第5章、Linux文件系統(tǒng)與設(shè)備文件系統(tǒng)

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第5章、Linux文件系統(tǒng)與設(shè)備文件系統(tǒng)
    發(fā)表于 10-27 14:13 ?0次下載
    《<b class='flag-5'>Linux</b>設(shè)備驅(qū)動(dòng)開(kāi)發(fā)<b class='flag-5'>詳解</b>》第5章、<b class='flag-5'>Linux</b><b class='flag-5'>文件系統(tǒng)</b>與設(shè)備<b class='flag-5'>文件系統(tǒng)</b>

    linux文件系統(tǒng)基礎(chǔ)

    一 、linux文件結(jié)構(gòu) 文件結(jié)構(gòu)文件存放在磁盤(pán)等存貯設(shè)備上的組織方法。主要體現(xiàn)在對(duì)
    發(fā)表于 11-07 15:28 ?0次下載

    Windows和Linux的區(qū)別以及Linux系統(tǒng)目錄結(jié)構(gòu)

    本文先對(duì) Windows 和 Linux 上面文件系統(tǒng)原理、組織概念進(jìn)行區(qū)分,并給出例子、列舉兩者的優(yōu)缺點(diǎn)以具體說(shuō)明,最后較為詳細(xì)地介紹了 Linux 系統(tǒng)
    的頭像 發(fā)表于 06-18 17:37 ?8498次閱讀
    Windows和<b class='flag-5'>Linux</b>的區(qū)別以及<b class='flag-5'>Linux</b><b class='flag-5'>系統(tǒng)</b>的<b class='flag-5'>目錄</b><b class='flag-5'>結(jié)構(gòu)</b>

    Linux實(shí)用教程之Linux文件目錄操作總結(jié)

    Linux系統(tǒng)下除了一般文件之外,所有的目錄和設(shè)備(光驅(qū)、硬盤(pán)等)都是以文件的形式存在的,本節(jié)主要講述
    發(fā)表于 09-29 16:18 ?0次下載

    解析Linux內(nèi)核頁(yè)管理中那些鮮為人知的秘密

    虛擬內(nèi)存管理,而頁(yè)管理是在虛擬內(nèi)存管理中尤為重要,本文主要以回答幾個(gè)頁(yè)管理中關(guān)鍵性問(wèn)題來(lái)解析Linux內(nèi)核
    的頭像 發(fā)表于 06-11 16:32 ?1581次閱讀

    Linux中匿名頁(yè)的訪(fǎng)問(wèn)分析

    Linux 中 有后備文件支持的頁(yè)稱(chēng)為文件頁(yè),如屬于進(jìn)程的代碼段、數(shù)據(jù)段的頁(yè),內(nèi)存回收的時(shí)候這些
    的頭像 發(fā)表于 10-12 17:52 ?2799次閱讀

    嵌入式Linux開(kāi)發(fā)之文件系統(tǒng)目錄結(jié)構(gòu)介紹

    前言Linux文件系統(tǒng),顧名思義:文件是數(shù)據(jù)的集合,文件系統(tǒng)不僅包含著文件中的數(shù)據(jù)而且還有文件系統(tǒng)
    發(fā)表于 11-01 16:31 ?3次下載
    嵌入式<b class='flag-5'>Linux</b>開(kāi)發(fā)之<b class='flag-5'>文件系統(tǒng)</b><b class='flag-5'>目錄</b><b class='flag-5'>結(jié)構(gòu)</b>介紹

    嵌入式Linux系統(tǒng)編程學(xué)習(xí)之一目錄結(jié)構(gòu)

    嵌入式Linux系統(tǒng)編程學(xué)習(xí)之一目錄結(jié)構(gòu)文章目錄嵌入式Linux
    發(fā)表于 11-02 12:06 ?9次下載
    嵌入式<b class='flag-5'>Linux</b><b class='flag-5'>系統(tǒng)</b>編程學(xué)習(xí)之一<b class='flag-5'>目錄</b><b class='flag-5'>結(jié)構(gòu)</b>

    STM32MP157 Linux系統(tǒng)移植開(kāi)發(fā)篇7:Linux內(nèi)核目錄結(jié)構(gòu)詳解

    Linux內(nèi)核目錄結(jié)構(gòu)Linux內(nèi)核源代碼非常龐大,隨著版本的發(fā)展不斷增加。它使用目錄樹(shù)結(jié)構(gòu),并
    發(fā)表于 12-17 18:29 ?10次下載
    STM32MP157 <b class='flag-5'>Linux</b><b class='flag-5'>系統(tǒng)</b>移植開(kāi)發(fā)篇7:<b class='flag-5'>Linux</b>內(nèi)核<b class='flag-5'>目錄</b><b class='flag-5'>結(jié)構(gòu)</b><b class='flag-5'>詳解</b>

    RISC-V Linux頁(yè)創(chuàng)建

    臨時(shí)頁(yè)分析 MMU開(kāi)啟前,需要建立好kernel、dtb、trampoline等頁(yè)。以便MMU開(kāi)啟后,并且在內(nèi)存管理模塊運(yùn)行之前,kernel可以正常初始化,dtb可以正常地被解析
    的頭像 發(fā)表于 10-08 11:14 ?484次閱讀