虛擬地址、線性地址、物理地址(2)

1中講述了分段機制,那麼LUNIX中的段是什麼樣子的?

      由於大多數硬件都不支持段機制只支持頁機制,爲了使LINUX具有更好的可移植性需要去掉段機制而只使用頁機制。80x86規定段機制是不可禁止的。因此不能繞過他而只給出線性地址。聰明的LINUX設計人員讓段基地址爲0,段界限爲4GB,這樣虛擬地址和線性地址就是同一個。80X86規定必須爲代碼段和數據段創建不同的段所以LINUX必須爲代碼段和數據段分別創建一個基地址爲0段界限爲4GB的段描述符。LINUX內核運行在特權級0用戶程序運行在特權級3,80x86規定特權級爲3的程序無法訪問特權級爲0的段。LINUX必須創建四個段描述符-特權級爲0的代碼段和數據段,特權級爲3的代碼段和數據段。

LINUX內核不區分數據段和堆棧段,體現了LINUX盡力少使用段。

 

LINUX這樣進行段機制基地址全是0這樣可能多個段使用相同的線性地址空間,會相互覆蓋。就需要使用分頁機制

 

分頁機制

把線性地址轉換爲物理地址

1.用32位線性地址最高10位作爲頁目錄項的索引,將它乘以4與CR3中頁目錄的起始地址相加,獲得相應目錄項在內存的地址

2.從這個地址開始讀取32位頁目錄項,取出其高20位,再給低12位補0,形成的32位就是頁表在內存的起始地址

3.用32位線性地址中的中間10位作爲頁表中頁表項的索引,將它乘以4與頁表的起始地址相加,獲得相應頁表項在內存中的地址

4.從這個地址開始讀取32位頁表項,取出其高20位,再將線性地址的第11-0位放在低12位,形成最終的32位頁面的物理地址

 

頁:線性地址空間分成若干大小相等的頁。

頁面:物理地址空間劃分成與頁大小相等的若干存儲快。

頁過大過小都會影響內存的使用率。確定4KB是最好的

 

頁表把線性地址映射爲物理地址的一種數據結構,與段表類似。包含兩部分(1)物理頁面基地址:線性地址空間的一個頁裝入內存後所對應的物理頁面的起始地址。(2)頁的屬性:表示頁的特性,比如該頁是否在內存中是否可被讀出或者寫入。

 

頁面的大小爲4KB他的物理頁面的基地址肯定是4K的倍數,因此他的最低12爲全爲0(例如地址是100的倍數,則後兩位全爲0),可以用這12爲來存放頁的屬性。這樣32位地址就可以完全描述頁的映射關係。

 

 

但是呢????????????????

線性地址空間爲4GB,4GB/4KB = 1M,線性地址空間被劃分爲1M個頁那麼就有1M個頁表項,每個頁表項佔4個字節。總需4M的連續空間,這當然是不可能的。

 

 

解決的辦法是使用兩級頁表:

兩級頁表就是對頁表再進行分頁。4MB的頁表再進行分頁可以分爲1K個頁,每個頁表項佔4字節,總共4K大小正好一個頁。也即是這4K的大小可以存放4GB的線性地址空間的所有映射信息。

 

線性地址總共32位,高10位是頁目錄,有10位表示頁表目錄項的下表,指向一個頁表。中間10位是頁,表示一個具體頁表中目錄項的下標。最後12位是offset表示物理頁面中的偏移量。

 

頁表的結構

 

不管是頁目錄還是頁表,每個表項佔四個字節,其表項結構基本相同。

物理頁面基地址:對頁目錄而言,指的是頁表所在物理頁面的內存的起始地址。對頁表而言是指頁所對應的物理頁面在內存的起始物理地址。

其他還有一些屬性位,請大家參閱書籍這裏不再詳細說明。

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章