缺頁異常被觸發通常有兩種情況——
程式設計的不當導致訪問了非法的位址
訪問的位址是合法的,但是該位址還未分配物理頁框.
下面解釋一下第二種情況,這是虛擬記憶體管理的乙個特性。儘管每個程序獨立擁有3gb的可訪問位址空間,但是這些資源都是核心開出的空頭支票,也就是說程序手握著和自己相關的乙個個虛擬記憶體區域(vma),但是這些虛擬記憶體區域並不會在建立的時候就和物理頁框掛鉤,由於程式的區域性性原理,程式在一定時間內所訪問的記憶體往往是有限的,因此核心只會在程序確確實實需要訪問物理記憶體時才會將相應的虛擬記憶體區域與物理記憶體進行關聯(為相應的位址分配頁表項,並將頁表項對映到物理記憶體),也就是說這種缺頁異常是正常的,而第一種缺頁異常是不正常的,核心要採取各種可行的手段將這種異常帶來的破壞減到最小。
缺頁異常的處理函式為do_page_fault(),該函式是和體系結構相關的乙個函式,缺頁異常的**可分為兩種,一種是核心空間(訪問了線性位址空間的第4個gb),一種是使用者空間(訪問了線性位址空間的0~3gb),以x86架構為例,先來看核心空間異常的處理。
缺頁異常處理 do page fault
regs 發生異常時暫存器的值 error code 5位的值,第3位標誌異常發生在核心態還是使用者態 do page fault函式 獲得產生缺頁異常的位址,該位址儲存在cr2暫存器 address read cr2 檢查線性位址是否屬於第4個g 如果核心訪問不存在的記憶體頁框,則執行vmallo...
詳解缺頁中斷 缺頁中斷處理(核心 使用者)
一 什麼是缺頁中斷?程序線性位址空間裡的頁面不必常駐記憶體,在執行一條指令時,如果發現他要訪問的頁沒有在記憶體中 即存在位為0 那麼停止該指令的執行,並產生乙個頁不存在的異常,對應的故障處理程式可通過從外存載入該頁的方法來排除故障,之後,原先引起的異常的指令就可以繼續執行,而不再產生異常。二 頁面排...
Linux 記憶體管理 缺頁異常的幾種原因
給定乙個線性位址,mmu 通過頁目錄表 頁表的轉換,找到對應的實體地址。在這個過程中,如果因某種原因導致無法訪問到最終的物理記憶體單元,cpu 會產生一次缺頁異常,從而進入缺頁異常處理程式 總結一下,缺頁異常的原因有以下幾種 1 導致缺頁異常的線性位址根本不在程序的 虛存區間 中,段錯誤。棧擴充套件...