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表示物理頁面中的偏移量。
頁表的結構
不管是頁目錄還是頁表,每個表項佔四個字節,其表項結構基本相同。
物理頁面基地址:對頁目錄而言,指的是頁表所在物理頁面的內存的起始地址。對頁表而言是指頁所對應的物理頁面在內存的起始物理地址。
其他還有一些屬性位,請大家參閱書籍這裏不再詳細說明。