先前我們介紹段機制的時候說到,x86的段機制把程式的邏輯位址轉換成線性位址,這裡要講的分頁機制是把線性位址對映成實體地址,也就說說,x86其實是用了兩套機制把邏輯位址轉換成實體地址的。我們也提到linux核心是怎樣繞過段機制從而讓x86的分段機制看起來不起作用的,我們還說到這樣的處理造成了段的資料保護的問題。下來我們就來討論x86的分頁機制。我們的思路依然是先介紹x86的分頁機制,然後再討論linux在上邊的實現。
我們還是從實現linux分頁機制的軟硬體構造上入手。實現分頁機制的硬體結構有:四個專用於分頁機制的32位暫存器:cr0、cr1、cr2、cr3,分頁部件,頁面快取記憶體;軟體結構有:頁,頁表,頁目錄,頁表項。
1、四個暫存器
我們說cr0這個暫存器決定了我們是否啟用分頁機制,cr0=0時表示不啟用分頁機制,此時經過段機制轉換來的位址直接對映到實體地址(大家可以想到,如果這樣的話,像上節linux核心的處理方法,勢必會帶來段的資料保護問題的),反之,對映到4g的線性位址。
cr1暫時沒用。
cr2是缺頁線性位址暫存器,當發生缺頁異常的時候,該暫存器儲存最後一次出現缺頁的全32位線性位址,這在異常處理時會介紹到,這裡我們不深究它的實現過程。
cr3就厲害了,它被叫做頁目錄基址暫存器,顧名思義,它儲存的是頁目錄的實體地址。我們就是通過該暫存器裡邊的值,找到對應的頁目錄中的頁表項,從而知道我們的乙個頁是儲存裡記憶體中的哪個位置的。
2、頁與頁表
1)、頁
分頁機制是這麼乙個思路:我們將線性位址空間劃分成若干相等的片,這一片就稱為乙個頁,並給各頁編號,從0開始,如第1頁,第2頁等。相應的,我們也把實體地址空間劃分成與頁大小相等的若干儲存塊,也同樣為他們編號,仍然可以從0開始。程式的對映過程是這樣的,現在我們的程式的容量是以頁為單位(即要麼佔乙個頁大小,要麼佔幾個頁大小),那麼我們要控制線性位址空間中的每個頁怎麼往實體地址裡邊存就比較容易了。
這樣就有乙個問題了,因為頁是固定大小的,那麼它過大或者過小都會影響記憶體使用率。頁過大,有時候會存在冗餘空間;頁過小,若有分支指令,則會存在在頁之間跳轉的情況,同樣影響效率。x86支援的標準頁大小為4kb(也支援4mb)。
2)、頁表
頁的屬性:描述一些頁的屬性資訊。
我們說過頁面大小為4kb,即乙個頁面會佔4kb的空間,那麼每個頁面的物理頁面基位址必然是4kb的整數倍,這樣其位址的最低12位總是0,那麼我們就可以用這12位存放頁的屬性,這樣用32位的位址就完全可以描述頁的對映關係,也就是頁表中乙個表項佔四個位元組就夠了。
不過,4gb的線性位址空間可以被劃分為1m個4kb大小的頁,每個頁表項佔4個位元組,則1m個頁表項就需要佔4mb的空間,而且還要求是連續的,這顯然是不現實的,於是把這4mb的頁表再以4kb為大小分頁,分為1k個頁,同樣對每個項描述需要四個位元組,這就是兩級頁表的管理方式。
3)、兩級頁表
兩級頁表結構
兩級頁表的第一級把它叫做頁目錄,用它來管理1m個頁的頁表。上邊說我們把1m個頁表項以4kb為頁分了1k個頁,於是我們用10位就可以檢索到這1k個頁目錄的每個目錄項了。現在我們把這1k個頁目錄(佔4kb)放進記憶體的某個位置,這個位置就叫做頁目錄起始位址。我們把這個起始位址放進cr3中,現在來乙個線性位址,我們根據線性位址的前10位,再根據cr3中的頁目錄起始位址,就可以得到目錄項在記憶體中的位址。那我們讀取這個目錄項,其高20位就是頁表在記憶體中的起始位址。於是我們用線性位址的中間10位和這個頁表起始位址就可以計算出頁表項的位置,這個頁表項和線性位址的的低12位就可以把這個線性位址定位到記憶體中具體的位置了。下圖是32位線性位址往實體地址的轉換過程。
3、頁面快取記憶體
知道cache原理的童鞋們對這個理解起來就比較容易了。它無非就是為了加快訪問速度。
由於在分頁情況下,頁表是放在記憶體中的,這使cpu每次至少兩次去訪問記憶體。頁面高速緩衝器儲存最近處理過的32項頁表項。當訪問線性位址空間的某個位址時,先檢查對應的頁表項是否在快取中,如果在就沒必要兩次訪問記憶體了。快取記憶體的命中率哈市相當高的。
linux分頁機制
在linux分頁機制中有幾個概念需要了解,線性位址,實體地址,頁目錄表,頁表,頁目錄項,頁表項。首先為了防止乙個程序非法跨越到另乙個程序或者乙個程序非法跨越到核心中,linux中使用了線性位址。線性位址是乙個程序執行過程中產生的位址,在32位的系統中其位址空間為0x00000000 0xffffff...
Linux下的分頁機制
分段可以給每個程序分配乙個不同的程序位址空間,而分頁可以把相同的線性位址空間對映到不同的實體地址空間。通俗的講,就是每個程序都有乙個虛擬位址到實體地址的轉換表,而這個轉換表不同的程序是不同的。所以就會出現不同程序的同乙個虛擬位址對應不同的實體地址 一 邏輯位址轉線性位址 機器語言指令中出現的記憶體位...
linux分段分頁機制
mmu使用分段單元硬體把邏輯位址轉換為虛擬位址,再使用分頁單元硬體把虛擬位址轉換為實體地址。因為這兩部分表示乙個獨一無二的邏輯位址,虛擬位址作為這個段位址另一種形式,當然也需要這兩個部分作為轉換的 原材料。這裡涉及乙個叫做段的暫存器,它的作用是放段選擇符 識別符號 共有六種 cs 儲存指向 的段的選...