我已阅读有关BIOS中断的信息,并知道只能在8086实模式下访问它们。
我的问题:
是否还有其他中断?我读过有关DOS的内容 中断,但我很困惑,如果他们真的可用 模式也是,什么是DOS中断列表。
进入保护模式后,BIOS会发生什么 中断表存储在0x00?是替换,还是存在但是 只是无法访问?
答案 0 :(得分:9)
在实模式下,您有256种不同的SOFTWARE TRIGGERED中断。在BIOS和DOS的早期阶段,它们只被用作“跳转地址”表。例如,DOS主要使用INT 21,因此应用程序可以编码为使用INT 21
处理器指令而不是CALL 1234:5678
- 真实地址会随着每个新版本的DOS而改变,但是INT 21仍然存在。当dos启动时,它会将其真实处理函数的地址放入中断表的那个插槽中。
INT XX
处理器指令可以使用0到255之间的中断号,因此它们都是可用的。如果在相应的中断表插槽中有任何有用的东西是另一回事 - 但是有许多常驻程序使用了一些特定的中断(如果你加载了多个这样的程序就会导致冲突)。
除此之外还有硬件中断 - 这些中断不是由软件触发,而是由键盘,软盘或硬盘等外部设备触发,当他们想告诉处理器“我需要一些服务”时。因此,例如,当您按下键盘上的某个键时,键盘控制器会触发中断9(不确定数字,这是很久以前的事,但中断8-15是为硬件保留的)。启动时,BIOS会将其键盘处理程序的地址放入中断表的相应条目中。无论何时按下一个键,键盘控制器都会触发中断9,这使得处理器在中断表中查找相应的地址,调用它 - 这将控制转移到BIOS - bios做了任何必要的事情来从中获取实际的密钥。键盘,然后返回到应用程序,它不知道发生了什么帽子。
所以回答你的第一个问题:有256个中断。 0-7用于处理器内部的东西。 07-0F由硬件触发。 10-1F保留给Bios,DOS使用20-27。其余的都未使用,这意味着,在中断表中没有为它们存储有效的过程入口点。 (后来变得非常模糊,我在这里过于简单化了。)
第二个问题:一旦进入保护模式,中断表将被处理器置于保护模式的操作系统所取代,因为BIOS程序是为没有保护模式的8086编写的,通常不安全如果不是在实模式下使用,并且不能很好地处理多任务处理。任何体面的操作系统都必须自己做这种事情。 DOS中使用的20-27的中断在其他操作系统中没有替代它们。因此,您无法在Linux上运行dos可执行文件,除了无法运行它们之外,如果它们使用dos中断,它们将无法工作。
第3个问题:BIOS中断本身就是纯软件,但它们会触发硬件事件。中断13用于软盘/硬盘。想要直接从软盘读取扇区的程序会用一些预定义的值填充处理器寄存器,调用中断13(因此跳转到BIOS例程,当BIOS启动时,其地址被放入中断表中),然后让bios做它的工作。还没有硬件的东西。当然,在中断处理程序中,BIOS会读取和写入软盘控制器的硬件端口,但应用程序不必了解详细信息。
答案 1 :(得分:1)
DOS中断可用于DOS。 (Windows中的16位程序也可以使用它们,因为它在虚拟8086模式下运行,而Windows试图像过去那样呈现一个环境。)在操作系统开始加载之前它们不存在,虽然......如果你正在构建自己的操作系统,除非你把它们放进去,否则它们根本就不存在。
一旦切换到保护模式,您基本上就会运行在切换期间设置的中断描述符表(IDT)。旧表仍然存在,因为它的格式足够不同,如果在切换之前发生中断,您不能只是覆盖它而不会有麻烦。而且你通常会出于几个原因保留它,包括它的用处,以防你出于某种原因必须切换回实模式。 (Windows 9x曾经这样做。有些驱动程序是16位,没有人想要更新它们......所以Windows有能力让这些驱动程序以实模式运行。)但是当处理器处于受保护状态时它不会被使用模式。
处理器不直接参与中断的实际处理。它甚至不知道它正在运行什么类型的计算机。基本上,它只是在IDT中看到一个条目并调用该中断处理程序。