頁號與頁內偏移(page number and offset)
把街道地址想成兩部分:一個門牌號,加上那棟樓裡的一個房號。「第 7 棟、12 室」就精準指到唯一一扇門。分頁系統裡的邏輯位址正是這樣一分為二。頁號是「樓棟」——你在哪一頁;偏移是「房號」——距離那一頁開頭幾個位元組。兩者合起來,指出唯一的一個位元組。
機制上,這個切分是靠「裁切位址的位元」完成的,並非在執行期用算術去除。若頁是 2^n 位元組,邏輯位址最低的 n 個位元就是偏移(一個從 0 到 2^n 減 1 的數,表示進入該頁多深),其餘較高的位元則是頁號(哪一頁)。例如 32 位元位址、4 KB 頁(2^12),最低 12 個位元是偏移,最高 20 個位元是頁號。硬體用頁號去索引分頁表、讀出頁框號,再把「同一組偏移位元」原封不動地黏到頁框號上,組成實體位址。翻譯過程中偏移從不改變,因為一個位元組在它的頁框裡與在它的頁裡距開頭的距離相同——頁與頁框等大。
這種位元切分正是分頁快速的原因,也是頁大小永遠是 2 的次方的原因:取出偏移與頁號不過是遮罩與位移位元,沒有緩慢的除法或乘法。初學者常見的錯誤是以為翻譯會「重新計算」偏移;其實不會——只有頁號到頁框那一段需要查表,偏移是直接帶過去的。哪天你看到某個頁大小不是 2 的次方,就該起疑;整套機制都仰賴這一點。
32 位元邏輯位址、4 KB 頁:位址 0x00001ABC 以二進位切分為 頁號 = 最高 20 位元 = 0x00001 = 1、偏移 = 最低 12 位元 = 0xABC = 2748。硬體查頁 1 找出其頁框,然後在實體位址中讓偏移 2748 維持不變。
以位元切分邏輯位址:高位元拿去索引分頁表,低位元原樣留作偏移。
翻譯時偏移「原樣帶過、不變」;只有頁號會被對應成頁框。頁大小永遠是 2 的次方,正是為了讓這種切分純粹是位元遮罩,而非緩慢的除法。