2014-09-05 126 views
0

我有三個主要問題僅適用於x86架構,因爲我是intel 80386芯片的用戶。「BIOS中斷調用」是什麼意思

這些是我所知道的基礎知識:中斷表從地址0x0000開始,因此int 0x01指令將搜索地址0x0001。處理器然後將看到地址0x0001中包含的地址,並期望0x0001所指向的地址處的中斷處理程序0x01的開始。

所以我的第一個問題是,中斷處理程序如何指示它自己的結束,並告訴CPU返回進行中斷的進程。指標只是NULL,還是有一個特殊的值來表示處理程序已完成?

第二個問題:在MS-DOS中,硬件中斷0x19用於重新啓動計算機。我想知道這個中斷的處理程序在哪裏。它在BIOS ROM中,這就是爲什麼它被稱爲「BIOS中斷呼叫」?請向我解釋這個詞。此外,由於MS-DOS中斷0x21包含MS-DOS功能(如獲取和打印字符),它在RAM中而不是BIOS,對嗎?這是否意味着它不是BIOS中斷?我想知道如果我加載一箇中斷表與十六進制99中斷,這意味着0x99是最後一個,如果用戶做0x9A(這是一個多於0x99)會發生什麼?

請回答我的這三個問題,因爲我對現在的系統編程有很多瞭解。我很抱歉,如果這是漫長而複雜的。 thanx提前!

回答

1

在實模式下,中斷表中的每個條目長度爲4個字節,地址段部分爲2個字節,偏移量爲2個字節。這意味着中斷處理程序0x01的地址位於地址0x0:0x0004。中斷處理程序通常通過執行IRET指令返回發生中斷的位置。這會彈出地址和中斷髮生時CPU保存在堆棧上的值FLAGS寄存器。

中斷0x19的處理程序通常會指向BIOS ROM中的某個位置,但有可能是某些東西掛鉤了中斷並將其指向RAM中的處理程序。 MS-DOS中斷0x21通常會指向RAM中的位置,雖然存在位於ROM中的MS-DOS版本。

在實模式下,中斷表通常沒有限制,因此無論是否有用的值已加載到所有256個可能的條目中,都存在所有256個可能的條目。當發生中斷時,CPU將開始執行它在表中找到的任何地址的指令。如果地址不是中斷處理程序的位置,通常會導致崩潰。

+0

很好的解釋。然而,中斷處理程序0x01的指針在0x0:0x0001開始,並在0x0:0x0004結束?如果是這樣,你是說如果用戶使用int 0x02,CPU將搜索地址0x0:0x0005(直到0x0:0x0008)作爲指向中斷處理程序的指針嗎?實際上,我想知道,因爲地址是x86中的雙字值,所以我們將通過什麼地址引用位於0x0開始的雙字值:0x0005?請解釋。 – user3724492 2014-09-05 07:35:18

+0

不,中斷處理程序1的入口長度是4個字節,第一個字節是地址0000:0004,第二個是0000:0005,第三個是0000:0006,最後是0000:0007, 。 '0000:0000' - '0000:0003'的字節組成中斷處理程序0的入口。中斷處理程序2的入口在'0000:0x0008 - 0000:0x000B'。在表中輸入的四個字節是一個雙字值,它是處理程序的地址。 – 2014-09-05 16:03:38

+0

非常感謝。我得到了整個事情(最後)。順便說一句,我正在寫我的虛擬機! – user3724492 2014-09-08 05:40:27