1. 程式人生 > >缺頁中斷和缺頁異常

缺頁中斷和缺頁異常

只讀 請求 線程 原子操作 中斷處理 釋放 第一次 原因 內核

缺頁異常

會出現缺頁異常的情況:

  1. 線性地址不在虛擬地址空間中
  2. 線性地址在虛擬地址空間中,但沒有訪問權限
  3. 接上一條,沒有與物理地址建立映射關系

fork等系統調用時並沒有映射物理頁,寫數據->缺頁異常->寫時拷貝

  1. 映射關系建立了,但在交換分區中
  2. 頁面訪問權限不足

task_struct: linux描述進程的結構體

1.5個互斥狀態,兩個終止狀態,同時定義了新的睡眠狀態可以響應致命信號

  1. pidtgid
  2. 每個進程在內核上都存有進程堆棧,相鄰的有一個縣城描述符 8k

使用thread_union來存放 thread_info stack

  1. 進程標記 (如還未被執行,被信號殺死,開始關閉等)
  2. 表示進程的親屬關系 通過鏈表建立兄弟父子關系
  3. 優先級 以及 相應的調度策略
  4. mm 進程地址空間
  5. 信號處理

簡述異常處理過程

  1. 判斷是否在原子操作時出現異常 return0
  2. 判斷是否是內核線程(mm_struct ==NULL)如果是進入內核異常處理,通過遍歷異常鏈表試圖修正,如果無法通過調試則打印後退出。
  3. 查找後面最近的虛擬地址空間(VMA),如果沒有則地址錯誤,發送信號殺掉進程。
  4. 如果有,判斷後面找到的VMA是否為棧(棧可以增長),如果是進入異常錯誤處理,不是發送信號後殺掉進程。
  5. 判斷是否是權限錯誤
  6. 進行異常處理

先確定線性地址對應的目錄項是否存在,如果不存在為引發缺頁的進程分配一個物理頁框

被訪問的頁框在主存中,(寫時拷貝)將存在的只讀頁復制到新頁框中。fork()後給子進程分配零頁,只可以讀。進行寫操作時

被訪問的頁框不在主存中,分配頁框,分為線性映射,非線性映射,swap映射。malloc後第一次訪問該頁。

釋放信號量,返回0,異常處理完畢。

缺頁中斷

在請求分頁的過程中,如果訪問的頁面不再內存中,會產生一次缺頁中斷,在外存中找到所缺的一頁將其調入內存。

步驟:

  1. 保護cpu現場
  2. 分析中斷原因
  3. 轉入缺頁中斷處理函數
  4. 恢復cpu現場,繼續執行

LRU算法 最近最久未使用

中斷時一條指令處理完成後響應中斷,異步。(通常不可預知)

異常是一條指令執行時就可以相應,同步。(通常可以預知)

缺頁中斷和缺頁異常