2011-04-26 148 views
13

沒錯。我今天花了三個多小時試圖瞭解爲什麼在保護模式下不能調用BIOS的ISR。我得到的,一旦你設置和IDT它不會一定是在平時的地址IVT加段不必須在保護模式下,等固定的大小。但我還是不明白爲什麼你不能僅僅指剛創建單條4GB段,將您的IDT段映射到BIOS IVT,將所有內容設置爲響鈴0並調用它們。不應該那樣工作?爲什麼我不能從保護模式調用BIOS中斷?

大多數文章要麼說:「記住,你不能使用BIOS在保護模式下的中斷!」沒有探討這個問題,或者是非常具有描述性的,並且引用陷阱,例外,圖片重塑,缺乏權利以及段登記的問題作爲其背後的原因。

這將是非常有益的,如果有人能拿出一個更人性化的解釋......我不懷疑什麼文章說,我只是想知道爲什麼它是這樣一個「痛苦」!

在此先感謝!

回答

9

我覺得最大的問題是,BIOS程序被寫入假設處理器處於實模式。如果您從不受支持的上下文中調用它們,則無法確定BIOS例程的行爲如預期。他們可能會自行失敗,或者他們可能會弄亂處理器狀態並將您踢出保護模式。

+0

非常感謝您的意見! – Max 2011-05-26 14:33:24

3

我到達回到舊的東西,所以這可能是稍微偏離,而是「保護」模式的主要目的之一是從應用程序代碼隔離敏感/安全代碼。原來的規範有4級0到3環。實踐中,我只見過操作系統的環0和應用程序的環3。允許應用程序修改或調用中斷可能會讓他們進入操作系統。所以這樣的操作僅適用於在環0中運行的代碼 - 即操作系統。讓代碼在ring 0中運行的唯一方法是創建一個驅動程序。 Windows將基本加載驅動程序到它自己的專用內核內存(雖然這樣也有/正在改變在Windows Vista/7)環運行0

+1

謝謝保羅。但是在這種情況下,創建一個在ring 0中運行的設備驅動程序是不可能的,它只需調用相應的BIOS ISR,然後將適當的值返回給應用程序? – Max 2011-04-26 19:01:07

6

馬克斯,你可能創建在ring 0調用一個簡單的BIOS ISR,如果操作系統是16位保護模式下運行運行設備驅動程序。但在32位模式下,第一個16位或32位地址偏移量或立即數值將被錯誤地解釋,並且指令流將不同步。在實際或16位保護模式下,立即數和偏移量默認爲16位長,在32位保護模式下爲32位長,在64位(長)模式下爲32位或64位長。因此,只有在字節(< 128,如果我沒記錯的話)中表示的偏移量和字節立即值才能用於ISR。

此外,任何段寄存器加載(除零之外)將表現不同在比它在任何保護模式實模式。同樣,實模式代碼和保護模式的代碼能夠共同努力,使之可以編寫代碼工作,但它是很不容易的。

例如,`

mov ah, 0B8h 
    mov al, 000h 
    mov es, ax 
    mov byte ptr es:0, 'o' 
    mov byte ptr es:2, 'k'` 

會把字母「OK」在實模式下的文本模式下屏幕的左上角,但有工作在16位或32位保護模式下,偏移量爲0xB800的全局描述符表項必須具有0x000B8000的基址。

但是,如果您滿意,只有16位保護模式下運行比較常見的代碼:`

mov ax, 0B800h 
    mov es, ax 
    mov dword ptr es:0, 0076b076fh` 

應該工作一樣好。

相關問題