2016-08-01 66 views

回答

2

LDT是可選的。 IDT是實模式IVT的保護模式等同物並且用於相同的目的。它描述了進入ISR和異常處理程序的入口點。您需要一個IDT才能夠處理硬件和軟件中斷和異常。如果你的生活沒有這些,你不需要建立一個IDT。

切換到保護模式需要的不僅僅是設置GDT和執行LGDT。您需要將CR0位0更改爲1,執行跳轉,並使用指向相應GDT條目的選擇器加載段寄存器(最好全部用於避免在各種上下文切換期間未初始化段寄存器的問題)。

實模式代碼通常無法在保護模式下運行(虛擬8086(子)模式除外),因爲段寄存器中的實模式值無法在保護模式下工作,並且因爲段:偏移地址在保護模式下被翻譯成不同的物理地址(在GDT和頁面翻譯上閱讀)。 IOW中,將段寄存器中的值加1不再具有將16加到生成的物理地址的效果。此外,你不能有一個同時可讀,可寫和可執行的段。

理論上,您可以通過選擇器N選擇基地址爲N * 16的64KB段的描述符來設置GDT和/或LDT描述符。在實踐中,這是一個混亂。然而,Borland在他們的Borland Pascal 7中實現了這個方案,所以你可以用類似於你爲真實模式編寫保護模式的方式編寫保護模式程序。

+0

請您詳細說明該段:保護模式下的偏移轉換嗎? –

+3

@PantherCoder強制性閱讀:英特爾®64和IA-32架構軟件開發人員手冊, 3「系統編程指南」,第2 - 5章及其附件。 –

+0

是的,他們通常會使用16位保護模式的處理器。某些較早的操作系統和環境會導致內存訪問錯誤,故障處理程序會生成一組描述符條目以允許指令正確完成,然後在導致故障的指令處重新啓動。通常你會發現使用LOADALL指令直接加載隱藏的描述符條目。當然,這有很多陷阱 - 如果你希望操作系統和程序同時運行,它們的一些描述符可能會重疊,這很難讓操作系統和保護模式程序一起運行。 –

相關問題