我正在編寫一個小的操作系統,它將在用戶模式下執行一些代碼(特權級別3)。從該用戶級別的代碼中,我想調用一個打印消息的操作系統的中斷。現在我並不關心我的中斷處理程序如何接受參數或類似的東西,我真的只想讓一箇中斷處理程序通知我(用戶)代碼已經執行。使用iret切換到用戶模式
我的問題是:如何在用戶模式下運行代碼?我有一個函數用代碼段和數據段(都具有用戶模式特權)設置本地描述符表。我不明白的是我應該如何將這些段加載到cs
,ss
和ds
。我成功加載了我的LDT,但我不知道如何實際使用它。我聽說我應該使用iret
,但我不明白如何。
我的另一個問題是我的中斷處理程序應該如何工作。比方說,我爲矢量編號0x40安裝一箇中斷處理程序,我要打印「hello,user mode!」。我知道如何設置一箇中斷處理程序,但我不完全理解從用戶模式進入內核中斷處理程序時上下文將如何切換。我知道cs
寄存器必須更改,因爲我的例程將從我的IDT條目中指定的代碼段運行。我也明白,堆棧選擇器可能也會改變,但我不能確定這一點。
有人請向我解釋當中斷門被調用時會發生什麼樣的上下文變化?
好的,你回答了我的問題和更多!我現在理解的是,我需要一個包含我的內核堆棧的TSS,謝謝你的幫助。 –
我登錄只是爲了upvote這!謝謝!對於那裏的其他人,我也推薦osdev和Intel ISA手冊。他們真的清除了一切。 – Sid
你是什麼意思IRET不改變數據段?你在談論通用寄存器中的值嗎? –