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)的非法訪問,它與頁錯誤有根本的區別: 頁錯誤是操作系統的一種機制,而段錯誤是訪問未初始化的頁面造成的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章