用戶態 內核態

參考

內核態

代碼不受限制,自由訪問任何有效地址,進行直接端口訪問
對應ring0
留給操作系統代碼,設備驅動程序代碼使用的

用戶態

受處理器諸多檢查,只能訪問映射其地址空間的頁表項中規定的在用戶態下可訪問頁面的虛擬地址,且只能對任務狀態段(TSS)中I/O許可位圖(I/O Permission Bitmap)中規定的可訪問端口進行直接訪問
對應ring3
普通用戶程序使用

Ring0-Ring3

intel三種級別的運行模式,ring0級別最高,ring3級別最低,

用戶態到內核態的切換

訪問調用門的長轉移指令CALL

訪問中斷門或陷阱門的INT指令

中斷,軟中斷,系統調用

中斷

硬件中斷:來自時鐘,外設
可編程中斷:programmed interrupt,執行引起軟件中斷的指令。
例外中斷:如頁面錯。
都由系統負責處理。當發生一箇中斷時,如果CPU正在比該中斷級低的處理機運行級上運行,它就在解碼下條指令之前,接受該中斷,並提高處理機運行級。內核處理中斷的操作順序如下:
1,對於正在進行的進程,保存其當前寄存器上下文,並創建壓入一個新的上下文層。
2,確定中斷源,識別中斷類型。如是時鐘或磁盤的。
3,查找中斷向量。當系統接受一箇中斷時,它從機器中得到一個數,系統把這個作爲查表的偏移量。這個表通常成爲中斷向量(interrupt vector)。中斷向量的內容包括各種中斷源的中斷處理程序的地址,以及中斷處理程序取得參數的方式。
4,內核調用中斷處理程序。
5,中斷處理程序執行那個返回,恢復(彈出)前一上下文層。

軟中斷

軟中斷通知進程發生了異步事件。
系統有個進程表,每個進程在進程表中有有個進程表項,每個進程表項有個軟中斷信號字段,紀錄發向一個進程的所有未處理的軟中斷信號。
當一個進程即將從核心態返回到用戶態時,或它要進入或離開一個適當的低調度優先級時,內核要檢查它是否收到了一個軟中斷信號。
內核僅當一個進程從核心態返回到用戶態時才處理軟中斷信號。

系統調用

我們在C程序中調用系統調用好像是個一般的函數調用,當實際上調用系統調用會引起用戶態到核心態的狀態變化,這是怎麼做到的呢?
原來,C編譯程序採用一個預定義的函數庫(C之程序庫),其中的函數具有系統調用的名字,從而解決了在用戶程序中請求系統調用的問題。這些庫函數一般都執行一條指令,該指令將進程的運行方式變爲核心態,然後,使內核開始爲系統調用執行代碼。我們稱這個指令爲操作系統陷入(operating system trap)。
系統調用的接口是一箇中斷處理程序的特例。
在處理操作系統陷入時,
1,內核根據系統調用號查系統調用入口表,找到相應的內核子程序的地址。
2,內核還要確定該系統調用所要求的參數個數。
3,從用戶地址空間拷貝參數到U區(Unix V)。
4,保存當前上下文,執行系統調用代碼。

發佈了45 篇原創文章 · 獲贊 2 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章