操作系統(tǒng)分頁機制

操作系統(tǒng)的分段機制,將程序分成不同的段進行管理,我們編程訪問內(nèi)存地址時,訪問的其實是操作系統(tǒng)抽象給我們的虛擬地址,通過段基址:段偏移的方式訪問內(nèi)存虛擬地址,極大了簡化了程序員的編程結(jié)構,解決了之前操作系統(tǒng)存在的兩個問題:

  • 地址空間沒有隔離
  • 程序運行的地址不確定

但是分段機制也存在嚴重的問題,在分段的映射方法中,并沒有解決內(nèi)存使用效率的問題。如果應用程序過多,或者內(nèi)存碎片過多,又或者曾經(jīng)被換出到硬盤的內(nèi)存段需要再重新裝載到內(nèi)存,可內(nèi)存中找不到合適大小的區(qū)域,要如何解決這個問題,就引入了分頁機制。

一、分頁實現(xiàn)原理

分頁的基本方法是將地址空間等分成某一個固定大小的頁,每一頁大小由硬件來決定,或者是由操作系統(tǒng)來決定(如果硬件支持多種大小的頁)。

  • 1.將進程的邏輯地址空間分成若干個大小相等的片,稱為頁面或頁;
  • 2.將物理內(nèi)存空間分成與頁大小相等的若干個存儲塊,稱為物理塊或頁框;
  • 3.在為進程分配內(nèi)存時,以塊為單位,將進程中的若干頁分別裝入多個可以不相鄰的塊中。

關于進程分頁,當我們把進程的邏輯地址空間按頁來分割,常用的數(shù)據(jù)和代碼會被裝載到內(nèi)存。暫時沒用到的是數(shù)據(jù)和代碼則保存在磁盤中,需要用到的時候,再從磁盤中加載到內(nèi)存中即可。

1.1 硬件分頁機制

頁表是什么?

每個處理器進程都會維護一個頁表,頁表由一條條代表映射規(guī)則的記錄組成,每一條稱為一個頁表項(Page Table Entry, PTE),頁表存儲在物理內(nèi)存中。為了加速映射效率,在MMU中存在一塊頁表緩存,被稱為快表(Translation Lookaside Buffers)。MMU接收到虛擬地址后,首先在TLB中查找,如果找到該VA(virtual address)對應的PTE就直接轉(zhuǎn)換找不到再去外存頁表查找,并置換進TLB

最簡單的分頁機制

硬件上使用一級頁表的方式是最簡單的,訪問效率也最高,頁面的大小一般為 4KB。為了能夠定位和訪問每個頁,需要有個頁表,保存每個頁的起始地址,再加上在頁內(nèi)的偏移量,組成線性地址,就能對于內(nèi)存中的每個位置進行訪問了,其訪問流程圖如下:

image.png

虛擬地址分為兩部分,頁號p和頁內(nèi)偏移d。頁號作為頁表的索引,頁表包含物理頁每頁所在物理內(nèi)存的基地址。這個基地址與頁內(nèi)偏移的組合就形成了物理內(nèi)存地址。一級頁表這么簡單,只要經(jīng)過一次的地址轉(zhuǎn)換就能找到對應的物理地址,訪問效率應該是最好的。

我們假設在32位環(huán)境下,虛擬的地址空間為4GB,如果采用一級頁表,采用4KB為一個頁,那就需要1M個頁表。每一個頁表需要4個字節(jié)來存儲,那么整個4GB的地址空間的映射就需要4MB的內(nèi)存來存儲映射表。如果每個進程都有自己的映射表,100個進程就需要400MB的內(nèi)存,對于內(nèi)核來說,確實有點大。

這個問題在64位體系結(jié)構下, 情況會更加糟糕. 而每個進程都需要自身的頁表, 這導致系統(tǒng)中大量的所有內(nèi)存都用來保存頁表。

1.2 多級頁表

對于一級頁表中所有頁表項必須提前建好,并且要求是連續(xù)的。如果不連續(xù),就沒有辦法通過虛擬地址里面的頁號找到對應的頁表項了。為減少頁表的大小并容許忽略不需要的區(qū)域, 計算機體系結(jié)構的就使用了多級頁表,下面以二級頁表為例,看硬件上怎么實現(xiàn)的。

二級頁表

第一級表稱為頁目錄,存放在一頁 4K 大小的頁面中,具有 2^10 個 4 字節(jié)長度的表項。 這些表象指向?qū)亩壉怼?線性地址的最高 10 位(31-22)用作以及表中的索引。

第二級稱為頁表,長度也是 4K 大小的一個頁面,最多有 1K 個 4 字節(jié)的表項。 每個 4 字節(jié)的表項含有相關頁面的 20 位物理基地址。 二級頁表使用線性地址的中間 10 位(21-12)作為表項索引值,以獲取含有頁面 20 物理地址基地址的表項。 該20位頁面物理基地址和線性地址中的第12位(頁內(nèi)偏移)組合在一起就得到了分頁轉(zhuǎn)換過程的輸出值,即對應的的最終物理地址。

對于給定的線性地址,CR3 寄存器指定頁目錄表的基地址。線性地址的高10位用于索引這個頁目錄表,以獲得指向相關第二級頁表的指針。線性地址空間中間10位用于索引二級頁表,以獲得物理地址的高20位。線性地址的第12位直接作為物理地址的第12位,從而組成一個完整的32位物理地址。

虛擬地址轉(zhuǎn)換為物理地址的整個過程由MMU(Memory Management Uni)內(nèi)存管理單元完成:
CPU取到虛擬地址-> MMU查頁目錄->MMU查頁表->MMU得到頁表項->MMU得到物理頁面編號->MMU得到物理地址。

那么二級頁表怎么解決頁表過大的問題呢?我們假設只給這個進程分配了一個數(shù)據(jù)頁。如果只使用頁表,也需要完整的 1M 個頁表項共 4M 的內(nèi)存,但是如果使用了頁目錄,頁目錄需要 1K 個全部分配,占用內(nèi)存 4K,但是里面只有一項使用了。到了頁表項,只需要分配能夠管理那個數(shù)據(jù)頁的頁表項頁就可以了,也就是說,最多 4K,這樣內(nèi)存就節(jié)省多了。

頁目錄和頁表的表項格式如下圖所示,其中位32-12含有物理地址的高20位,用于定位物理地址空間中一個頁面(也叫頁幀)的物理基地址。(頁號是隱含的)表項的低 12 位含有頁屬性信息。

頁目錄項格式

頁表項格式

上圖就是頁目錄項和頁表項的格式??梢钥闯?,由于頁表或者頁的物理地址都是4KB對齊的(低12位全是零),所以上圖中只保留了物理基地址的高20位(bit[31:12])。

第12位可以安排其他用途:

  • 【P】存在位,表示該頁是在內(nèi)存還是在磁盤。為1表示頁表或者頁位于內(nèi)存中。否則,表示不在內(nèi)存中,必須先予以創(chuàng)建或者從磁盤調(diào)入內(nèi)存后方可使用。
  • 【R/W】:讀寫標志。為1表示頁面可以被讀寫,為0表示只讀。當處理器運行在0、1、2特權級時,此位不起作用。頁目錄中的這個位對其所映射的所有頁面起作用。
  • 【PWT】:緩沖寫策略。Page級的Write-Through標志位。為1時使用Write-Through的Cache類型;為0時使用Write-Back的Cache類型。當CR0.CD=1時(Cache被Disable掉),此標志被忽略。對于我們的實驗,此位清零。
  • 【PCD】:禁止緩存位。Page級的Cache Disable標志位。為1時,物理頁面是不能被Cache的;為0時允許Cache。當CR0.CD=1時,此標志被忽略。對于我們的實驗,此位清零。
  • 【D】:修改位。該位由處理器固件設置,用來指示此表項所指向的頁是否寫過數(shù)據(jù)。
  • 【A】:訪問位。該位由處理器固件設置,用來指示此表項所指向的頁是否已被訪問(讀或?qū)懀?,一旦置位,處理器從不清這個標志位。這個位可以被操作系統(tǒng)用來監(jiān)視頁的使用頻率。

正常來說, 對于32位的系統(tǒng)兩級頁表已經(jīng)足夠了, 但是對于64位系統(tǒng)的計算機, 這遠遠不夠.

首先假設一個大小為4KB的標準頁, 所以offset字段需要12位.這樣線性地址空間就剩下64-12=52位分配給頁中間表Table和頁目錄表Directory。如果我們現(xiàn)在決定僅僅使用64位中的48位來尋址(這個限制其實已經(jīng)足夠了, 2^48=256TB,即可達到256TB的尋址空間)。剩下的48-12=36位被分配給Table和Directory字段, 即使我們現(xiàn)在決定為兩個字段各預留18位,那么每個進程的頁目錄和頁表都包含218個項, 即超過256000個項.

二,總結(jié)

基于這個原因, 所有64位處理器的硬件分頁系統(tǒng)都使用了額外的分頁級別. 使用的級別取決于處理器的類型

操作系統(tǒng)引入分頁的概念,作為虛擬內(nèi)存挑戰(zhàn)的解決方案。與以前的方法(如分段),分頁有很多的優(yōu)點

分頁機制解決了分段機制的效率問題,因為分頁將內(nèi)存劃分為固定大小的單元,它不會產(chǎn)生外部碎片

非常靈活,支持稀疏虛擬地址空間

但是雖然分頁機制也有它的局限性,例如它會產(chǎn)生內(nèi)碎片,內(nèi)碎片的大小由分頁機制的最小物理內(nèi)存決定的,比如來說,我們每個進程都只需要幾個字節(jié),那么對于現(xiàn)在的分頁機制也是按照一個頁大小來分配,但是相對于分段機制的浪費也小了很多。

對于多級頁表雖然解決了內(nèi)存浪費的問題,但是頁表存放在主存中,因此程序每次訪存至少需要兩次:一次訪問獲取物理地址,第二次訪問才獲得數(shù)據(jù)。內(nèi)存訪問的速度就減半。在大多數(shù)情況下,這種延遲是無法忍受的。操作系統(tǒng)不得不努力設計出一個更好的分頁機制,它不僅可以工作,而且工作得更好,對于這種情況,硬件又基于頁表的訪問局限性設計了TLB來解決這個問題。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容