缺頁中斷和缺頁異常
阿新 • • 發佈:2018-02-02
只讀 請求 線程 原子操作 中斷處理 釋放 第一次 原因 內核
缺頁異常
會出現缺頁異常的情況:
- 線性地址不在虛擬地址空間中
- 線性地址在虛擬地址空間中,但沒有訪問權限
- 接上一條,沒有與物理地址建立映射關系
fork等系統調用時並沒有映射物理頁,寫數據->缺頁異常->寫時拷貝
- 映射關系建立了,但在交換分區中
- 頁面訪問權限不足
task_struct: linux描述進程的結構體
1.5個互斥狀態,兩個終止狀態,同時定義了新的睡眠狀態可以響應致命信號
- pid和tgid
- 每個進程在內核上都存有進程堆棧,相鄰的有一個縣城描述符 8k
使用thread_union來存放 thread_info 和 stack
- 進程標記 (如還未被執行,被信號殺死,開始關閉等)
- 表示進程的親屬關系 通過鏈表建立兄弟父子關系
- 優先級 以及 相應的調度策略
- mm 進程地址空間
- 信號處理
簡述異常處理過程
- 判斷是否在原子操作時出現異常 是 return0
- 判斷是否是內核線程(mm_struct ==NULL)如果是進入內核異常處理,通過遍歷異常鏈表試圖修正,如果無法通過調試則打印後退出。
- 查找後面最近的虛擬地址空間(VMA),如果沒有則地址錯誤,發送信號殺掉進程。
- 如果有,判斷後面找到的VMA是否為棧(棧可以增長),如果是進入異常錯誤處理,不是發送信號後殺掉進程。
- 判斷是否是權限錯誤
- 進行異常處理
先確定線性地址對應的目錄項是否存在,如果不存在為引發缺頁的進程分配一個物理頁框
被訪問的頁框在主存中,(寫時拷貝)將存在的只讀頁復制到新頁框中。fork()後給子進程分配零頁,只可以讀。進行寫操作時
被訪問的頁框不在主存中,分配頁框,分為線性映射,非線性映射,swap映射。malloc後第一次訪問該頁。
釋放信號量,返回0,異常處理完畢。
缺頁中斷
在請求分頁的過程中,如果訪問的頁面不再內存中,會產生一次缺頁中斷,在外存中找到所缺的一頁將其調入內存。
步驟:
- 保護cpu現場
- 分析中斷原因
- 轉入缺頁中斷處理函數
- 恢復cpu現場,繼續執行
LRU算法 最近最久未使用
中斷時一條指令處理完成後響應中斷,異步。(通常不可預知)
異常是一條指令執行時就可以相應,同步。(通常可以預知)
缺頁中斷和缺頁異常