先看一個很普通的程式:
int *p = malloc(4096);
p[0] = 100;
從 Programmer 的角度:
malloc()
↓
拿到 Memory
↓
寫入 100
好像沒有什麼特別的。但 OS 不一定在 malloc() 回傳的那一刻,就立刻:
找到 Physical Frame
↓
清成 0
↓
建立完整 Mapping
↓
準備好所有實體 Memory
它有可能先說「好,這段 Virtual Address 你可以用。」等到程式真的第一次 p[0] = 100 ; 才發現:目前還沒有可以直接完成這次 Access 的 Mapping。於是 CPU:Page Fault!進入 Kernel
Kernel 再把需要的 Memory 準備好,最後讓程式繼續。
所以今天最重要的觀念就是:Page Fault 並不等於錯誤;它首先代表目前這次 Memory Access 無法依照現有 Translation / Protection State 直接完成,需要 OS 介入。