頁(page)
想像一卷很長的文字卷軸,你想讓它更好處理,於是把它裁成等長的單張並編號:第 0 張、第 1 張、第 2 張。頁正是如此——程式邏輯(虛擬)位址空間中的一個固定大小切片。程式以為自己擁有的整個位址空間,不過就是這些等大切片依序排成的一串,從 0 開始往上編號。
更精確地說,頁是一塊連續、固定大小的「邏輯」位址區塊——多數系統上通常是 4 KB,不過也有更大的「大頁」(2 MB、1 GB)。位址空間被切成這個大小的頁,編號 0、1、2,依此類推。關鍵特性是:頁是程式眼中所見的「邏輯」記憶體單位;它在實體記憶體中的孿生兄弟是頁框,兩者大小相同。分頁能運作,正因頁與頁框等大,所以任一頁都剛好塞進任一頁框,在頁框這個層級不留任何空隙。一個邏輯位址被解讀為一組(頁號, 偏移):頁號指出是哪一片切片,偏移指出在那片切片裡走了多遠。
頁之所以重要,是因為它是記憶體被對應、保護、共享,以及(在虛擬記憶體系統中)在磁碟與記憶體之間搬移的粒度單位。頁並非由其內含資料的性質決定——一頁並不「知道」自己裝的是程式碼還是某個數字;它只是一扇固定的位址視窗。常見的混淆是把頁(邏輯,程式所見)與頁框(實體,真正存放之處)搞混;它們刻意等大,但頁是位址空間的切片,頁框是真實記憶體的格位。
在 4 KB(2^12 位元組)的頁大小下,邏輯位址 0 到 4095 是頁 0,位址 4096 到 8191 是頁 1,依此類推。位址 5000 落在頁 1(5000 除以 4096 = 1),偏移為 904(5000 減 4096)。
從 0 編號的等大 4 KB 切片;任一邏輯位址都恰好屬於某一頁,並有確定的偏移。
頁是「邏輯的」(程式所見),頁框是「實體的」(實際存放處)——大小相同,世界不同。別以為頁號就等於頁框號;分頁表存在的意義正是在兩者之間做對應。