天天看點

Linux系統--程序位址空間之虛拟位址空間

    Linux系統,支援實體記憶體虛拟化,即程序并不直接在真實實體位址上尋址,而是由Linux核心為每一程序維護了一個特殊的虛拟位址空間(virtual address space)。這個位址空間是線性的,從0開始尋址,到某個最大值(不同作業系統或不同位數的系統可能不一樣)。

    虛拟位址空間由許多頁(page)組成。典型的頁大小是4096 bytes(4K, 32位系統)和8192bytes(8K,64位系統)。每個頁面都有有效(valid)和無效(invalid)兩種狀态,一個valid page和一個實體頁或一些二級存儲媒體相關聯,例如一個交換分區或磁盤上的檔案。

    一個程序不能直接通路一個存儲在二級存儲中的頁,除非這個頁和實體記憶體中的頁相關聯的。如果程序嘗試進行這樣的通路,存儲器管理單元(MMU)會産生頁錯誤(page fault),核心會從二級存儲換入需要的頁面。例如你對磁盤檔案進行讀取,這就導緻IO操作,當然這些操作是核心級的,對使用者透明的。當然系統為了滿足各程序對記憶體的需求(實體記憶體有限),也經常性的将實體頁面換出到虛拟位址頁面。

    說到這裡,筆者聯想到了一種開發調試過程中經常遇到錯誤:段錯誤(segmentation fault)。造成這種錯誤的原因是,對無效頁面(invalid)的非法通路,它與頁錯誤有根本的差別: 頁錯誤是作業系統的一種機制,而段錯誤是通路未初始化的頁面造成的。

繼續閱讀