【问题标题】:What interrupts are available in 8086 real mode?8086 实模式下有哪些中断可用?
【发布时间】:2014-01-18 11:57:31
【问题描述】:

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

我的问题:

  • 还有其他可用的中断吗?我读过关于 DOS 中断,但我很困惑它们是否真的可用 模式也是,DOS中断列表是什么。

  • 一旦我们进入保护模式,BIOS 会发生什么 中断表存储在 0x00 ?它是取代,还是存在但 只是无法访问?

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

【问题讨论】:

  • 使用 Ralph Brown 的中断列表作为规范参考。实际实现的完全取决于您使用的 DOS 模拟器。
  • 可以在ctyme.com/intr/int.htm 找到一个非常有用的参考资料(我用来查找中断)。只需单击表中的中断号,即可获得可调用的不同函数的巨大列表。

标签: assembly operating-system interrupt x86-16 real-mode


【解决方案1】:

在实模式下,您有 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 为 Bios 保留,DOS 使用 20-27。其余的没有使用,这意味着在中断表中没有为它们存储有效的过程入口点。 (这在后来变得非常模糊,我在这里过于简单化了)。

第二个问题:一旦进入保护模式,中断表就会被将处理器置于保护模式的操作系统替换,因为 BIOS 例程是为没有保护模式的 8086 编写的,通常不安全如果不是在实模式下使用,并且不能很好地处理多任务。任何体面的操作系统只需要自己做这种事情。 DOS 使用的 20-27 中断在其他操作系统中无法替代它们。所以你不能在 Linux 上运行 dos 可执行文件,除了不能运行之外,如果它们使用 dos 中断,它们将无法工作。

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

【讨论】:

  • 感谢您提供非常详细和清晰的答案。因此,如果我正在构建自己的操作系统,我将不会遇到任何这些 DOS 中断,并且必须自己加载它们,对吗?
  • 除了 BIOS 和 DOS 中断,谁来加载其他的?
  • 是的。当您的操作系统启动时,您可以依靠正在设置的 BIOS 中断,但其他一切,您必须自己做。例如,您可以使用中断 13h 读取/写入硬盘,但将磁盘扇区分配给文件和管理目录是您的操作系统必须做的事情。基本上你正在更换dos。如果您愿意,您可以通过以兼容的方式使用从 20 小时开始的中断(FreeDos 做到这一点),使您的操作系统尽可能类似于 MS-DOS,或者您可以发明一种完全不同的方式在应用程序和您的操作系统之间进行通信。
【解决方案2】:
  • DOS 中断在 DOS 中可用。 (Windows 中的 16 位程序也可以使用它们,因为它在虚拟 8086 模式下运行,并且 Windows 试图呈现像过去一样的环境。)在操作系统开始加载之前它们并不存在,不过……如果你正在构建自己的操作系统,除非你把它们放进去,否则它们根本不存在。

  • 一旦您切换到保护模式,您基本上就无法使用您在切换期间设置的中断描述符表 (IDT)。旧表仍然存在,因为它的格式不同,如果在切换之前发生中断,您不能直接覆盖它而不会冒麻烦。无论如何,您通常会出于几个原因保留它,包括它在您出于某种原因必须切换回实模式时的有用性。 (Windows 9x 曾经这样做。一些驱动程序是 16 位的,没有人愿意更新它们……所以 Windows 能够让这些驱动程序在实模式下运行。)但是当处理器处于受保护状态时,它不会被使用模式。

  • 处理器不直接参与中断的实际处理。它甚至不知道它在什么类型的计算机上运行。基本上,它只是在 IDT 中看到一个条目并调用该中断处理程序。

【讨论】:

  • 感谢您的出色回答。但是,您对 2 的观点与 Guntram Blohm 所写的内容不冲突吗?还是我误解了什么?
  • @Cygnus:明显的冲突是由于观点。就处理器而言,一旦它处于保护模式,保护模式表就是真正的表,而实模式表只是一堆字节。因此可以说保护模式表“取代”了实模式表。即使您没有覆盖旧的,在您切换回实模式之前,它对处理器也不再有意义。
  • 好的。所以操作系统可以随意覆盖它想要的旧表?
  • 我们俩都是正确的 ;-) 我在想 Linux,它会自行设置所有内容,并且没有任何理由保留旧表。 cHao 正在考虑早期的 Windows 操作系统,出于兼容性原因,它们将使用旧表。在这两种情况下,当系统在保护模式下运行时,不会使用 DOS 中断表。但是,虽然 Linux 会覆盖它以永不恢复,但 Windows 会保留它并不时切换回实模式。
  • @Cygnus:如果它没有计划切换回实模式——或者,如果它计划拥有所有自己的实模式中断处理程序(即使是 BIOS 通常会处理的东西) -- 那么是的,它可以安全地覆盖旧表。
猜你喜欢
  • 2011-01-03
  • 1970-01-01
  • 2021-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-16
  • 2020-06-12
相关资源
最近更新 更多