轉自: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