Page Fault 時的處理
當 page fault 的時候,CPU 會將控制權交給 OS。OS 要做的就是在實體記憶體中找出一個 free page,然後由可執行檔案中將資料放進這個 free page。接著再更新 virtual 與 physical address 之間的對應(將目前的 virtual address 對應到剛剛在 physical memory 中找出來的 page)。
那 OS 是怎麼知道缺少的資料是放在可執行檔案中的哪個地方呢?。在 object file 中,資料是以 section 來分開。比如 .data .text .bss 這幾個 section。在 Windows 平台,PE 檔也是以 section 來區分放到不同的 page 上。在 linking 時,linker 會儘量把 section 合併,以達到最佳的記憶體使用效率。
然而在 Linux 系統上將 executable 載入記憶體時,是以 segment 而非 section 為單位。segment 就是有同等存取屬性的 section。比如說有 3 個 section,它們的存取屬性都是唯讀,那麼它們在 linking 的時候,就可能被併入同一個 segment。一般可執行檔都會有唯讀、可讀可寫、可讀可執行這三類的存取屬性,那麼它們可能就會被分成 3 個 segment。
不管是 Windows or Linux 平台,當 loader 載入 executable 時,它會將 executable header 一併載入。這個 header 記錄了檔案中每個 segment 的 virtual memory area (VMA) 及在檔案中的 offset(Windows 稱作 RVA)。藉著這些內容,當 page fault 發生時,OS 便可知道這個 virtual address 對應的這個頁,其資料在 executable 中的 offset。如此 OS 便可以正確地將缺少的資料載入到記憶體中。
留言
張貼留言