虛擬記憶體 和 page fault 的解釋

2022-06-23 21:04:04 字數 1674 閱讀 9448

linux 核心給每個程序都提供了一個獨立的虛擬地址空間,並且這個地址空間是連續的。這樣程序就可以很方便地訪問記憶體,更確切地說是訪問虛擬記憶體。

假設某個程序需要100mb的空間,而記憶體假設是16mb的,如果程序直接使用實體地址,就會因為記憶體不足而無法執行。

既然程序不是直接訪問實體記憶體,那麼程序中涉及的記憶體地址當然也不是實體記憶體地址。而是虛擬的記憶體地址,虛擬的記憶體地址和物理的記憶體地址之間保持一種對映關係,這種關係由記憶體管理單元(mmu)進行管理。

記憶體管理單元(memory management unit,mmu),將實體記憶體分割成多個pages,mmu管理程序的虛擬地址空間中的page和實體記憶體中的page之間的對映關係。、

因為是對映,所以隨時都可能發生變化,例如某個程序虛擬記憶體空間中的page1,在不同的時間點,可能出現在實體記憶體中的不同位置(當發生了頁交換時)。

虛擬地址空間的內部又被分為核心空間和使用者空間兩部分。並不是所有的虛擬記憶體都會分配實體記憶體,只有那些實際使用的虛擬記憶體才分配實體記憶體,並且分配後的實體記憶體,是通過記憶體對映來管理的。

當程序訪問它的虛擬地址空間中的page時,如果這個page目前還不在實體記憶體中,此時cpu是不能工作的,linux會產生一個hard page fault中斷。系統需要從慢速裝置(如磁碟)將對應的資料page讀入實體記憶體,並建立實體記憶體地址與虛擬地址空間page的對映關係。然後程序才能訪問這部分虛擬地址空間的記憶體。

page fault 又分為三種:minor page faultmajor page faultinvalid(segment fault)

也稱為 soft page fault,指需要訪問的記憶體不在虛擬地址空間,但是在實體記憶體中,需要mmu建立實體記憶體和虛擬地址空間的對映關係。

當一個程序在呼叫 malloc 獲取虛擬空間地址後,首次訪問該地址會發生一次soft page fault。

通常是多個程序訪問同一個共享記憶體中的資料,當某些程序還沒有建立起對映關係,訪問時也會出現soft page fault。

也稱為 hard page fault,指需要訪問的記憶體不在虛擬地址空間,也不在實體記憶體中,需要從慢速裝置載入。

從磁碟 swap in 回到實體記憶體就是 hard page fault。

注意:swap in 和 swap out 的操作都是比較耗時的。

也稱為 segment fault,指程序需要訪問的記憶體地址不在它的虛擬地址空間範圍內,屬於越界訪問,核心就會報 segment fault 錯誤。

造成 segment fault 的原因可能有以下幾種: