在8086实模式下可以使用哪些中断?

Cyg*_*nus 3 assembly operating-system interrupt real-mode x86-16

我已经阅读了关于BIOS中断的信息,并且知道它们只能在8086实模式下访问.

我的问题:

  • 还有其他中断吗?我已经阅读过关于DOS中断的内容,但我很困惑,如果它们在实模式下也可用,以及DOS中断列表是什么.

  • 进入保护模式后,存储在0x00的BIOS中断表会发生什么?是替换,还是存在但只是无法访问?

  • BIOS中断如0x13或0x19,它们是如何实现的?它是在软件中还是通过处理器?

Gun*_*ica 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中断,它们将无法工作.

第三个问题:BIOS中断本身就是纯软件,但它们会触发硬件事件.中断13用于软盘/硬盘.想要直接从软盘读取扇区的程序会用一些预定义的值填充处理器寄存器,调用中断13(因此跳转到BIOS例程,当BIOS启动时,其地址被放入中断表中),然后让bios做它的工作.还没有硬件的东西.当然,在中断处理程序中,BIOS会读取和写入软盘控制器的硬件端口,但应用程序不必了解详细信息.