2017-02-24 123 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使用该异常/中断号作为索引到表并调用特定的处理程序。

操作系统为中断和异常定义了表和处理程序,因此它们是不同数量的操作系统。

相关问题