關注“技術簡說”(頭條同名),帶你由淺入深學習linux內核源碼。linux內核開發100講免費教程,每晚下午9點準時更新,敬請收看。進我主頁點”視頻“欄目即可觀看。
在后面《邏輯地址、虛擬地址、線性地址和化學地址大掃盲》一節我們談到了:
cpu在訪問某個邏輯地址的數據的時侯須要先把這種邏輯地址轉換為線性地址,之后再把線性地址轉換為化學地址,這樣能夠真正的訪問到相應的數據。而我們也提到了在linux系統中,邏輯地址跟線性地址是一致的(也可以理解成是相同的)。所以邏輯地址轉換成化學地址,雖然就差一個環節了,那就是線性地址到化學地址的轉換,那我們明天就來看這部份內容。
Linux內核里把線性地址轉換成化學地址是通過頁表映射來實現的。頁表映射具體還可以分為二級頁表、三級頁表等,而且原理是相同的邏輯地址和物理地址的轉換,五級頁表只是比二級頁表多了一個中間轉換環節而已。本文以二級頁表的映射機制來做說明。原理圖如下:
二級頁表映射機制
名詞解釋:
Page:頁目錄表,本文稱作一級頁表,表里的內容叫頁目錄表項。
PageTable:頁表,本文稱作二級頁表,表里的內容叫頁表項。
本文的講解以32位系統為例,在32位系統中,線性地址寬度為32bits,總大小4G。
線性地址的界定
從上圖可以看出,linux把32的線性地址界定成了3段:
想想看:從線性地址經過2次查詢加上1次匯總,是不是就得到相應的數學地址?
線性地址到化學地址轉換
然而,這個時侯,你們對細節還是不太了解的,由于我們還不太清楚這個頁目錄表(Page)和頁表(PageTable)里存的一條一條的都是哪些?
頁目錄里表和頁表
我們剛才講過頁目錄表(一級頁表)里保存的是1024個頁目錄表項,二級頁表里保存的是1024個頁表項,但是每位頁目錄表項和頁表項的大小都是4個字節。那這種頁目錄表項和頁表項的格式如何的呢?
P--位0,是存在()標志,用于指明表項對地址轉換是否有效。P=1表示有效;P=0表示無效。在頁轉換過程中,假如說涉及的頁目錄或頁表的表項無效,則會造成一個異常。
R/W--位1,是讀/寫(Read/Write)標志。假如等于1,表示頁面可以被讀、寫或執行。假如為0,表示頁面只讀或可執行。當處理器運行在超級用戶特權級(級別0、1或2)時,則R/W位不起作用。頁目錄項中的R/W位對其所映射的所有頁面起作用。
U/S--位2是用戶/超級用戶(User/)標志。假如為1,這么運行在任何特權級上的程序都可以訪問該頁面。假如為0,這么頁面只能被運行在超級用戶特權級(0、1或2)上的程序訪問。頁目錄項中的U/S位對其所映射的所有頁面起作用。
A--位5是已訪問()標志。當處理器訪問頁表項映射的頁面時,頁表表項的這個標志都會被置為1。當處理器訪問頁目錄表項映射的任何頁面時,頁目錄表項的這個標志都會被置為1。處理器只負責設置該標志,操作系統可通過定期地復位該標志來統計頁面的使用情況。
D--位6是頁面已被更改(Dirty)標志。當處理器對一個頁面執行寫操作時,才會設置對應頁表表項的D標志。處理器并不會更改頁目錄項中的D標志。
AVL--該數組保留特供程序使用。處理器不會更改這幾位,之后的升級處理器也不會。
高20位是化學地址頁面的基地址。
轉換過程
cpu先將32位線性地址分為三段,高10位,中間10位,低12位。
用高10位的值作為索引在頁目錄表里找到相應的頁目錄表項,頁目錄表項里記錄了二級頁表的化學地址
用中間10位的值作為索引在二級頁表(步驟1得到了二級頁表的化學地址)里找到相應的化學顯存基地址。
化學顯存的基地址左移12位加上線性地址的低12位,就得到了最終的化學地址。
缺頁
在須要訪問某一個頁表或頁面時,首先要檢測P位,若P為1,表明該頁表或頁面存在于化學儲存器中,則可以直接訪問它們。若P為0,表明該頁表或頁面不在化學儲存器中,這時分頁機制將發出缺頁中斷訊號,導致操作系統步入中斷處理解釋器,把所需的頁面從外存(例如c盤)調入顯存。
須要強調,80x86處理器在P位為0時,對頁表和頁目錄表的表項其它位不做任何解釋,此時那些位可以由軟件自行使用和解釋,Linux就借助此特點,在其它位中儲存該頁面在交換空間的地址。
當新頁面調入化學顯存時,若沒有空閑的數學頁面可用,須要從該進程占用的化學頁面中選擇某一頁淘汰,選中某一頁面淘汰時,須要檢測D位,當D為1時,表明該頁面已被更改過邏輯地址和物理地址的轉換,須要把它寫回外存。D=0時,表明該頁面從未更改,可以直接淘汰而不需寫回外存,訪問位A可以用于實現頁面淘汰的有關算法。
關注“技術簡說”(頭條同名),帶你由淺入深學習linux內核源碼。linux內核開發100講免費教程,每晚下午9點準時更新,敬請收看。進我主頁點”視頻“欄目即可觀看。