我读过关于BIOS中断的文章,并且知道它们只能在8086真正的模式下被访问。
我的问题:
发布于 2013-12-31 15:25:55
在实际模式下,您有256种不同的软件触发中断。在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,监督事务司使用了20-27。其余的未使用,这意味着在中断表中没有为它们存储有效的过程入口点。(后来变得很模糊,我在这里过分简化了)。
第二个问题:一旦进入保护模式,中断表就会被将处理器置于保护模式的操作系统取代,因为BIOS例程是为没有保护模式的8086编写的,如果不是在实际模式下使用通常是不安全的,并且不能很好地处理多任务处理。任何像样的操作系统都必须自己做这样的事情。而由DOS使用的20-27的中断,在其他OSes中没有替代的地方。因此,您不能在Linux上运行dos可执行文件,除了不能运行它们之外,如果使用dos中断,它们将无法工作。
第三个问题: BIOS中断本身纯粹是软件,但它们触发硬件事件。中断13是为了软盘/硬盘。一个程序希望直接从软盘读取扇区,它将用一些预定义的值填充处理器寄存器,调用中断13 (因此跳入BIOS例程,其地址在BIOS启动时被放入中断表中),并让bios完成它的工作。还没有硬件的东西。当然,在中断处理程序中,bios会读写软盘控制器的硬件端口,但是应用程序不必知道细节。
发布于 2013-12-31 15:41:54
https://stackoverflow.com/questions/20859185
复制相似问题