2012-01-12 243 views
3

作爲32位x86處理器的某些OS開發的一部分,我正在考慮在中斷描述符表中使用頁面錯誤向量的任務門。目的是強制任務切換,以確保處理程序的堆棧被映射(並避免中斷任務的堆棧的一部分未被映射的情況)。是否需要LDT?

我正在QEMU下運行我的內核(但它是),但我發現當頁面錯誤發生時,它崩潰(我回到命令提示符)。我一直在閱讀和挖掘搜索提示,可能會幫助我找出確切的原因。我認爲我錯過了某些東西和/或誤解了某些東西。順便說一下,當我將頁面錯誤向上設置爲使用中斷門時,我可以像預期的那樣使事情發揮作用。當我嘗試爲此使用任務門時會遇到問題(並且是的,我確實想堅持嘗試使用任務門)。

正確設置IDT部分以註冊頁面錯誤向量的任務門。它的選擇器引用GDT中TSS的描述符。就GDT中TSS的描述符而言,我確信它也是正確設置的。

但是,如果我已經正確填充了TSS並且至今無法確定如何設置其所有字段,我並不是100%確定的。其中一些例如esp,eip,cs,ds,es,fs,gs,ss和eflags一直比較直接。但是,其他如LDT段選擇器則不太清楚。 LDT段選擇器必須爲非零AND指向GDT中的LDT描述符?必須爲上述場景設置哪些字段?我正在琢磨這個問題。

任何幫助將不勝感激。

+0

萬一你忘記了,即使中斷和異常觸發它的執行,任務仍然是一項任務,而不是一個子程序。這意味着它必須具有主循環,所以當它完成處理第一個中斷/異常並執行IRET時,它的狀態將會在下一次它繼續在該IRET之後的指令處繼續運行。如果IRET後面沒有任何東西,它會崩潰。 – 2012-05-14 08:27:56

+0

另一件需要注意的事情。如果你想把一個任務切換到某個任務,它必須從任務中完成。任務切換總是從一個任務開始,並從一個任務開始。你不能只有一個TSS,一個用於頁面錯誤處理程序。你必須至少有兩個不同的。如果您嘗試從無效任務(無效的「TR」或無效的「TSS」)切換到指向(例如錯誤地初始化TSS字段)或無效任務,您將遇到異常並可能崩潰。 – 2012-05-14 08:35:50

+0

@Alex - 謝謝! – Sparky 2012-05-14 12:04:25

回答

1

LDT在正常運行的x86操作系統中不是必需的(的確,它在x86-64操作系統中是被禁止的)。

爲避免使用它,請將其設置爲零。

需要特別注意的一件事 - 關於TSS的osdev.org上的結構是回到前面(http://wiki.osdev.org/TSS)。你需要小心,因爲弄錯TSS會觸發TSS故障異常。

+0

在Windows上禁止,但在Linux上禁止。 'modify_ldt(2)'仍然適用於AMD64內核。 – Ruslan 2015-10-04 06:28:13