1.1 頁框和頁幀
????????我們知道通過頁表可以將虛擬內存映射到對應的物理內存,而操作系統對于物理內存的管理并不是以字節為單位的,而是將物理內存分為許多大小為4KB的塊,稱為頁框或頁幀,這就是為什么我們在創建共享內存是建議將大小設定為4096字節的整數倍,而4KB也是操作系統與磁盤交互的基本單位(8個扇區),對于文件來說,文件的內容被存放在磁盤的大小為4KB的塊中(Data Block),所以在進行磁盤級的IO操作時,就是將磁盤中的4KB的數據塊加載到物理內存對應的頁框中。
? ? ? ? 而由于物理內存中存在許多的4KB塊,OS為了管理好物理內存,需要知道每個塊的使用情況,用名字為struct page結構體對每個塊進行了描述,這樣只需要一個struct page類型的數組就可以管理整個物理內存了。
1.2 頁表的映射
? ? ? ? 目前我們對頁表的知識是有欠缺的,以32位機器為例,每一個字節的物理內存都需要虛擬內存與之對應,一個地址空間僅僅虛擬內存就占了2的32次方字節的大小,也就是4GB,所以頁表的映射關系并沒有這么簡單。
? ? ? ? 一個虛擬地址有32個比特位,OS將這32個比特位分為了10位、10位、12位,在每個進程中存在一張頁表目錄,該目錄保存著2的10次方張頁表,而前10位就是用來索引頁表目錄來找到對應的頁表的,頁表中存放的是對應頁框的起始地址。2的12次方正好是4KB對應著一個頁框的大小,最后12位是該虛擬內存在頁框中的地址偏移量,所以虛擬地址的前10位用于索引頁表,中間10位用于索引頁框的地址,最后的12位就可以鎖定具體的物理地址了。64位機器的原理和上述一樣
接下來我們大概計算一下按上述說法一個進程的頁表需要多大的內存,頁目錄1024*4也就是4Kb,頁表中索引的是頁框的地址,一個地址空間對應的物理內存有2的20次方個頁框,所以只需要20個字節就可以索引到所有的頁框,那么頁表的每個元素只需要3個字節接可以了,一個頁表需要3*1024個字節,一共有1024個頁表,所以一共需要的大小為4KB+3M的大小(上述大小是大概計算的并不準確)