詳解缺頁中斷-----缺頁中斷處理(內核、用戶)【轉】

轉自:https://blog.csdn.net/m0_37962600/article/details/81448553

一、什麼是缺頁中斷?

進程線性地址空間裏的頁面不必常駐內存,在執行一條指令時,如果發現他要訪問的頁沒有在內存中(即存在位爲0),那麼停止該指令的執行,併產生一個頁不存在的異常,對應的故障處理程序可通過從外存加載該頁的方法來排除故障,之後,原先引起的異常的指令就可以繼續執行,而不再產生異常。

二、頁面調度算法

將新頁面調入內存時,如果內存中所有的物理頁都已經分配出去,就按照某種策略來廢棄整個頁面,將其所佔據的物理頁釋放出來;

三、查看進程發生缺頁中斷的次數

ps -o majflt,minflt -C program查看

majflt和minflt表示一個進程自啓動以來所發生的缺頁中斷的次數;

四、產生缺頁中斷的幾種情況

1、當內存管理單元(MMU)中確實沒有創建虛擬物理頁映射關係,並且在該虛擬地址之後再沒有當前進程的線性區(vma)的時候,可以肯定這是一個編碼錯誤,這將殺掉該進程;

2、當MMU中確實沒有創建虛擬頁物理頁映射關係,並且在該虛擬地址之後存在當前進程的線性區vma的時候,這很可能是缺頁中斷,並且可能是棧溢出導致的缺頁中斷;

3、當使用malloc/mmap等希望訪問物理空間的庫函數/系統調用後,由於linux並未真正給新創建的vma映射物理頁,此時若先進行寫操作,將和2產生缺頁中斷的情況一樣;若先進行讀操作雖然也會產生缺頁異常,將被映射給默認的零頁,等再進行寫操作時,仍會產生缺頁中斷,這次必須分配1物理頁了,進入寫時複製的流程;

4、當使用fork等系統調用創建子進程時,子進程不論有無自己的vma,它的vma都有對於物理頁的映射,但它們共同映射的這些物理頁屬性爲只讀,即linux並未給子進程真正分配物理頁,當父子進程任何一方要寫相應物理頁時,導致缺頁中斷的寫時複製;

五、缺頁中斷的處理

缺頁中斷處理函數爲arch/arm/mm/fault.c文件中的do_page_fault函數

1、當前執行流程在內核態時

 

 

 

(1)通過mm是否存在判斷是否是內核線程,對於內核線程,進程描述符的mm總爲NULL,一旦成立,說明是在內核態中發生的異常,跳到no_context

if (in_atomic() || !mm)

goto no_context;

如果當前執行流程在內核態,不論是在臨界區還是內核進程本身(內核的mm爲NULL),說明在內核態出了問題,跳到標號no_context進入內核態異常處理,由函數_do_kernel_fault完成;

(2)

 

 

 

 

這個函數首先儘可能的設法解決這個異常,通過查找異常表中和目前的異常對應的解決辦法並調用執行;如果無法通過異常表解決,那麼內核就要在打印其頁表等內容後退出;

 

 

 

(2)用戶進程的缺頁中斷

對於用戶空間的缺頁中斷,則會調用函數_do_page_fault.

首先從CPU的控制寄存器CR2中讀出出錯的地址address,然後調用find_vma(),在進程的虛擬地址空間中找出結束地址大於address的第一個區間,如果找不到的話,則說明中斷是由地址越界引起的,轉到bad_area執行相關錯誤處理;

確定並非地址越界後,控制轉向標號good_area。在這裏,代碼首先對頁面進行例行權限檢查,比如當前的操作是否違反該頁面的Read,Write,Exec權限等。如果通過檢查,則進入虛擬管理例程handle_mm_fault().否則,將與地址越界一樣,轉到bad_area繼續處理。

handle_mm_fault()用於實現頁面分配與交換,它分爲兩個步驟:首先,如果頁表不存在或被交換出,則要首先分配頁面給頁表;然後才真正實施頁面的分配,並在頁表上做記錄。具體如何分配這個頁框是通過調用handle_pte_fault()完成的。

handle_pte_fault()函數根據頁表項pte所描述的物理頁框是否在物理內存中,分爲兩大類:

(1)請求調頁:被訪問的頁框不在主存中,那麼此時必須分配一個頁框,分爲線性映射、非線性映射、swap情況下映射

(2)寫實複製:被訪問的頁存在,但是該頁是隻讀的,內核需要對該頁進行寫操作,此時內核將這個已存在的只讀頁中的數據複製到一個新的頁框中

handle_pte_fault()調用pte_non()檢查表項是否爲空,即全爲0;如果爲空就說明映射尚未建立,此時調用do_no_page()來建立內存頁面與交換文件的映射;反之,如果表項非空,說明頁面已經映射,只要調用do_swap_page()將其換入內存即可;

參考博客:https://blog.csdn.net/u010246947/article/details/10431149

http://www.360doc.com/content/11/0721/17/6580811_135034260.shtml
————————————————
版權聲明:本文爲CSDN博主「m0_37962600」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/m0_37962600/article/details/81448553

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