受这个问题的启发
How can I force GDB to disassemble?
我想知道INT 21h作为一个概念。现在,我对内部结构有了一些非常生疏的知识,但没有太多细节。我记得在C64中有常规的中断和不可屏蔽的中断,但我的知识到此为止。你能给我一些提示吗?这是与DOS相关的策略吗?
发布于 2009-08-07 16:49:02
来自here的:一种多用途的操作系统中断,用于各种功能,包括读取键盘和写入控制台和打印机。它还用于使用早期的文件控制块(FCB)方法读写磁盘。
发布于 2009-08-31 15:30:25
DOS可以被认为是一个库,用于为PC提供文件/目录抽象(-and更多一点)。int 21h是一个简单的硬件“技巧”,它使得从这个库中调用代码变得很容易,而不需要事先知道它在内存中的位置。或者,您可以将此视为利用DOS API的方法。
现在,软件中断的话题是一个复杂的话题,部分原因是随着时间的推移,随着英特尔在x86家族中增加功能,同时试图保持与旧软件的兼容,概念也在不断演变。一个恰当的解释可能需要几页,但我会尽量简短。
主要的问题是你是在实数模式还是在保护模式。
实数模式是x86处理器的简单“原始”操作模式。这就是DOS的运行模式(当你在Windows下运行DOS程序时,实模式处理器是虚拟化的,所以在它里面也适用同样的规则)。当前运行的程序可以完全控制处理器。
在实模式下,有一个向量表,告诉处理器从0到255的每个中断跳转到哪个地址。此表由BIOS和DOS以及设备驱动程序填写,有时还包括有特殊需求的程序。这些中断中的一些可以由硬件(例如,通过按键)生成。其他是由特定的软件条件产生的(例如除以0)。它们中的任何一个都可以通过执行int n指令生成。
程序可以设置/清除“启用中断”标志;该标志只影响硬件中断,不影响int指令。
DOS设计者选择使用中断号21h来处理DOS请求--这个数字没有什么实际意义:它在当时只是一个未使用的条目。还有许多其他的中断例程(例如,10h是一个BIOS安装的处理图形的中断例程)。还要注意的是,所有这些都只适用于IBM PC兼容机。比方说,嵌入式系统中的x86处理器的软件和中断表的排列方式可能完全不同!
保护模式是一种复杂的“安全感知”模式,它是在286处理器中引入的,并在386处理器上进行了大量扩展。它提供了多个权限级别。操作系统必须对所有这些进行配置(如果操作系统出错,您将面临潜在的安全漏洞)。用户程序通常被限制在“最小特权”操作模式,在这种模式下,试图访问硬件端口,或改变中断标志,或访问某些存储器区域,会暂停程序并允许OS决定要做什么(无论是终止程序还是给程序它似乎想要的东西)。
中断处理变得更加复杂。可以说,通常情况下,如果用户程序执行软件中断,则中断号不会用作中断表的向量。相反,生成一般的保护异常,并且针对所述异常的OS处理程序可以(如果OS以这种方式设计)确定进程想要什么并服务于请求。我很确定Linux和Windows在过去(如果不是现在的话)已经在他们的系统调用中使用了这种机制。但还有其他方法可以实现这一点,例如SYSENTER指令。
发布于 2009-08-07 16:54:18
Ralph Brown's interrupt list包含了很多关于哪个中断做什么的信息。与所有其他寄存器一样,int 21支持多种功能,具体取决于寄存器的值。
non-HTML version of Ralph Brown's list也是可用的。
https://stackoverflow.com/questions/1245809
复制相似问题