2017-02-24 24 views
2

我寫了一些代碼來製作自己的操作系統,並學習x86彙編語言。在研究x86彙編語言時,我開始想知道中斷。看下面的彙編代碼:Linux與Windows之間'INT'指令的區別

mov ah, 2 
mov dl, 'A' 
int 0x21 

此代碼在屏幕上打印'A'。它適用於MS-DOS。

mov eax, 1 
mov ebx, 0 
int 0x80 

此代碼程序退出。它適用於Linux。最後一個:

mov ah, 2 
mov al, 1 
mov ch, 0 
mov cl, 2 
mov dh, 0 
mov dl, 0 
int 0x13 

我寫了這段代碼從磁盤複製內核代碼。該代碼包含在MBR領域。所以這個代碼執行時沒有操作系統。我在這裏有一個問題。

假設有人執行'int'指令來調用中斷,並且如果'int'指令在MBR扇區上執行,它將調用BIOS例程。但是我想知道'int'指令是在Linux還是Windows上執行的,會發生什麼?它是指與Linux/Windows中斷向量或BIOS例程相同的MBR扇區情況嗎?

坦率地說,我測試了試圖在Linux上執行第一個代碼,但它沒有奏效。我認爲'int'指令的結果取決於操作系統。如果這不是真的,有人能告訴我真相或任何想法嗎?

+1

如果您稍微瞭解一下操作系統實現,您應該知道'int'(或其他平臺上的其他類似指令)通常用作調用OS * specific *功能的方式。所以不,你不能使用BIOS或DOS的'int'「調用」並在其他地方使用它們。 –

+0

是的,INTs取決於它們的設置方式。 BIOS將它們設置爲一種默認方式,操作系統會根據需要更改它們。更多信息http://wiki.osdev.org/Interrupts –

+0

BIOS中斷是實模式代碼,它們在直接在pmode中執行時不起作用 – harold

回答

4

int指令產生一個軟件中斷。這會導致CPU從中斷描述表(IDT)執行中斷處理程序。在啓動時,BIOS設置一個IDT和一些執行一些基本服務的中斷處理程序。 DOS爲它提供了自己的中斷處理程序來提供DOS特定的功能。

現代操作系統在保護模式下運行。在這種模式下,BIOS服務不起作用,因爲它們被寫入以在實模式中執行現代操作系統通常用自定義表格替換標準中斷描述表。因此,DOS和BIOS服務都不可用。

+2

雖然實際的DOS和BIOS服務不可用,但受保護模式的操作系統經常模擬它們功能。這就是爲什麼大多數爲DOS編寫的程序都可以直接在Windows中運行的原因。 – vitsoft

1

INT指令觸發一個異常,幾乎就像一個除零除了會導致異常。不同之處在於INT允許您指定要觸發的異常。

操作系統必須定義一個異常表和中斷處理程序。表的位置和大小由硬件寄存器IDTR定義。各種例外情況(如除以零)都有一個指定的例外號碼。 (INT允許指定任何異常數。)

參見https://en.wikipedia.org/wiki/Interrupt_descriptor_table

當異常(或中斷)發生時,CPU使用該異常/中斷號作爲索引到表並調用特定的處理程序。

操作系統爲中斷和異常定義了表和處理程序,因此它們是不同數量的操作系統。

相關問題