2014-09-05 54 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