1. 程式人生 > >作業系統記憶體管理(分頁與分段)

作業系統記憶體管理(分頁與分段)

分段

分段本是由於8086是16位匯流排,為定址20位記憶體地址而增加的。在32位作業系統中,分段依然有用。

1)段描述符:描述該段的安全屬性,為一個64位長的值。在實地址模式中,只需要使用段暫存器(CS,DS,SS和ES)就可以了,每個段暫存器都是16位的,對應於地址匯流排中的高16位。每條“訪問”指令中的“內部地址”都是16位的,但是在送上地址匯流排之前都在CPU內部自動地與某個段暫存器中的內容相加,形成一個20位的實際地址。這樣,就實現了從16位內部地址到20位實際地址的轉換。這個方法與“段式記憶體管理”(現代意義的作業系統使用)相似,但並不完全一樣,主要是沒有地址空間的保護機制(後來出現的保護模式)。在保護模式中,在記憶體中存放“地址端描述結構”,即段描述符(8個位元組),在段描述符中有關於段的基地址與段的長度的說明,也有一些訪問許可權的控制。通過段暫存器可以找到對應的段描述符。

2) 段描述符表:表中存放段描述符。段描述符表可以看作一個數組,存放的是各個段描述符。

3)段暫存器:存放段描述符表的索引值,用於段選擇子。段暫存器中存放的是段描述符表(陣列)的索引,通過段暫存器中的值,找到段描述表中存放的段描述符。

4) GDTR(全域性性的段描述表暫存器,80386才有): 該暫存器指向全域性描述符表(gdt),gdt中儲存作業系統使用的程式碼段,堆疊段等段描述符,及各個任務的ldt,gdt的內容不隨任務的切換而切換。48位。

5) LDTR(區域性性的段描述表暫存器,80386才有): 該暫存器指向區域性描述符表(ldt),ldt中儲存當前任務所使用的程式碼段,資料段,堆疊段等的段描述符。ldt隨任務的切換而切換。16位。

6) 所有暫存器中只有cr3(儲存當前也目錄表地址,目錄表存放在記憶體中,實現線性地址到實體地址的轉換)中地址為實體地址,其他都為線性地址。

分頁

1) 如果沒有分頁機制,則由分段定址方式計算出的地址即為實體地址。

2) 分頁機制為程式提供了4G的連續地址空間。

3) 每個頁佔據4k,則4G的地址空間需要4G/4K = 1M個頁。每個頁需要4個位元組來描述其物理基地址。這樣則需要4M的地址空間存放頁資訊。

4) 作業系統將每1024個頁分成一組,組成一個頁表,頁表項中儲存該頁的物理基地址。則最多有1024個頁表。

5) 目錄表中有1024個項,每個項佔用4個位元組,項的內容為頁表的地址。

線性地址到實體地址的對映過程:

1)從CR3暫存器取得頁面目錄的基地址

2)以線性地址中的dir位段(前10位)為下標,在目錄中取得相應頁面表的基地址

3)以線性地址中的page位段(中間10位)為下標,在所得到的頁面表中取得相應的頁面描述項

4)將頁面描述項中給出的頁面基地址與線性地址中的offset位段(後12位)相加得到實體地址

在頁面對映過程中,CPU要訪問記憶體三次。第一次是頁面目錄,第二次是頁面表,第三次才是真正的目標。為了縮短查詢時間,可以使用快取記憶體(cache),有了快取記憶體,雖然在第一次用到具體的頁面目錄和頁面表時要到記憶體中區讀取,但一旦裝入了快取記憶體以後,一般可以在快取記憶體中找到,而不需要再到記憶體中去讀取了。另一方面,這整個過程是由硬體實現的,所以速度很快。

分頁和分段的區別:

1)頁是資訊的物理單位;段是資訊的邏輯單位。

2)頁的大小固定且由系統確定;段的長度不固定(取決於使用者所編寫的程式,通常由編譯程式在對源程式編譯時,根據資訊的性質來劃分)。

3)分頁的作業地址空間是一維的,只需一個記憶符,就可表示一個地址;分段的作業地址空間是二維的,程式設計師在標識一個地址時,既需給出段名,又需給出段內地址。

4)分段物理空間不連續,但段內是連續的;分頁物理空間不連續。