詳解缺頁中斷 缺頁中斷處理(核心 使用者)

2021-08-22 08:14:05 字數 2370 閱讀 7163

一、什麼是缺頁中斷?

程序線性位址空間裡的頁面不必常駐記憶體,在執行一條指令時,如果發現他要訪問的頁沒有在記憶體中(即存在位為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)使用者程序的缺頁中斷

對於使用者空間的缺頁中斷,則會呼叫函式_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()將其換入記憶體即可;

參考部落格:

缺頁中斷處理過程

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!缺頁中斷就是要訪問的頁不在主存,需要作業系統將其調入主存後再進行訪問。當程序執行過程中發生缺頁中斷時,需要進行頁面換入,步驟如下 1 首先硬體會陷入核心,在堆疊中儲存程式計數器。大多數機器將當前指令的各種狀態資訊儲存在cpu中特殊的暫存器中。2 啟...

缺頁中斷演算法 FIFO,LRU

在請求分頁系統中,可以通過查詢頁表中的狀態位來確定所要訪問的頁面是否存在於記憶體中。每當所要訪問的頁面不在記憶體時,會產生一次缺頁中斷,此時作業系統會根據頁表中的外存位址在外存中找到所缺的一頁,將其調入記憶體。缺頁本身是一種中斷,與一般的中斷一樣,需要經過4個處理步驟 1.保護cpu現場 2.分析中...

缺頁中斷 LRU OPT FIFO演算法

在請求分頁系統中,可以通過查詢頁表中的狀態位來確定所要訪問的頁面是否存在於記憶體中。每當所要訪問的頁面不在記憶體時,會產生一次缺頁中斷,此時作業系統會根據頁表中的外存位址在外存中找到所缺的一頁,將其調入記憶體。缺頁本身是一種中斷,與一般的中斷一樣,需要經過4個處理步驟 1.保護cpu現場 2.分析中...