1. 程式人生 > 實用技巧 >關於頁表項大小的問題以及坑比的頁表問題

關於頁表項大小的問題以及坑比的頁表問題

咱們用通俗的語言聊聊這個世紀性跨時代的問題。

#頁表項多大?

首先需要拋開一級二級x級頁表的概念。對於32位的地址空間,規定按4K一頁來管理,可以分成2^32B / 4K = 2^20 個頁。

所以32位機器,頁號範圍是 0 ~ 2^20-1,這點毋庸置疑。

現在要建造一樣東西來管理這些頁號,首先想到的就是陣列,那陣列每個元素定義多大才能保證覆蓋所有的頁號呢?

最大頁號2^20 - 1,十六進位制 0xFFFFF,佔了20位。所以陣列元素囊括的資料要保證可使用到20位,也就是 0 ~ 0xFFFFF。

好了,就按0xFFFFF來算吧,它佔用多大?按位元組來算,最多給他3B,就夠用了。所以每項給它3B大小綽綽有餘,但是為了整數操作,給它4B吧,這樣正好一個頁面存放整數個元素。當然多餘的12bit也不是浪費的,留著做標誌位許可權位。

聊到這,給這個陣列取個名吧,好了就要頁表(page table)吧,裡面的元素就叫頁表項吧(page table entry)。

#聊聊頁表

很多人看見一級二級三級四級頁表就開始慌了

如一級的格式

如32位機器的二級的格式

如64位機器的三級的格式

擒賊先擒王,哪個才是代表頁表?

一級中的page index代表頁表,二級中的PTX代表頁表,三級中的PTX代表頁表。很多人一開始學這個就是從左往右看,然後被自己帶到溝裡了。實質上根據一級到三級的變化發展趨勢,其實是從右往左看的。按照進化論最最本質的需求就是建立頁表,然後發現頁表的缺點才會在la地址上割出什麼PTX啊,PMX啊這些玩意。

一級原始時代,page index就作為一個龐大的頁表存在,整個大小4B * 2^20 = 4 MB,之前咱們聊過,頁表就是個陣列,陣列就是一個順序表,裡面的內容是連續的,想想一下子開一個連續的4M空間給它,你樂意不。這麼一大坨佔用連續記憶體塊,然且它是個整體,假設有個程式一直只訪問它前面的一小塊區域,那麼後面的大部分割槽域可不可以讓它呆在記憶體外面,用到在放進來?

二級農耕時代,有了需求就要去實現,把這個龐然大物分割一下吧,好主意,就按10bit來分,這樣一個頁表含有1024個頁表項,大小為4K,4K放在記憶體中相比原始時代並不佔地。現在劃分了很多個頁表,總歸要有東西來管理吧,那就剩下的bit位來幹這件事吧。有多少個頁表,看剩下的bit。PDX的作用就是管理頁表的,就像頁表管理頁表項,這樣分割的零零落落的頁表在PDX下連線了起來。PDX定義為10bit,代表PDX裡也有1024個項,這裡的每個項指向一個頁表,所以頁表總大小4B * 1024 * 1024 = 4MB, 還是4MB大小,但是隻佔用4K的連續記憶體空間,其餘用不到的暫時就可以不放進記憶體了,用連續的PDX項,尋找離散的頁表是個時代進步的表現。給PDX取個名,頁目錄項吧,就像書的目錄,要找某個內容,先去找到目錄,然後找到目錄中給的頁號,去定位到那一頁,頁裡的某一行或幾行就是我們要找的內容了。

當然有些頁表像老賴一樣常駐記憶體就不出去了,這時候就要搞個機制來清理它們了,吃老本不幹活的直接請出去,幹活的留下,這就涉及到快表的問題了,這邊不討論。

有人急了,聽說頁目錄表項也是4B,不是隻有1024項嗎?給10bit,2B夠了丫?是這樣嗎?肯定不是,按這個理解,1號頁表起始地址為1,2號為2,1023號為1023??要知道頁表裡面是貨真價實的頁號,那頁目錄項肯定也是貨真價實的東西,裡面存的是某組頁號所在的頁表的開頭,也就是,頁目錄表也存頁號,頁表也存頁號,只不過頁目錄項每隔1024存一個頁號,所以大小還是要根據頁號來,也就是20bit = 3B,為了整存選4B, 剩下12bit做標誌或許可權位。所以頁目錄大小為4B * 1024 = 4K

實際程式碼中pdx是地址,*pdx存放1024間隔頁號的某個頁號,也就是就找到了ptx,*ptx存放含有實體地址相關的內容了

三級牛逼時代我就不說了,只不過分割了頁目錄表。

至於如何定位頁號,就不說了。

所以,頁表問題也就是著名的陣列問題和數組裡尋找陣列問題。