缺頁中斷和缺頁異常


缺頁異常

 

會出現缺頁異常的情況:

  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算法 最近最久未使用

 

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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM