如果前32个中断是为异常保留的,定时器中断怎么能是0x08?

Its*_*mmy 5 assembly operating-system interrupt i386

我正在为intel i386开发一个嵌入式程序,我正在试图弄清楚如何使用硬件计时器.我在这里(以及其他地方)读过定时器中断是0x08,但是这个页面(和其他各种来源)说前32个中断是为异常保留的,而中断0x08特别是用于双重故障​​.这是真的吗?如何在没有操作系统调用的情况下使用程序集或非常低级别的C设置定时器中断处理程序?

我正在开发一个简单的操作系统来学习操作系统开发,所以我无法访问任何类似Linux或系统调用的内容(除非我自己实现系统调用.但是创建一个完全符合POSIX的操作系统远远超出了范围这个项目,所以我宁愿坚持简单,如果有点hacky,解决方案).

如果重要的话,我在QEMU上运行它,而不是实际的物理i386.

tof*_*fro 3

大多数人认为这(定时器使用 INT8)是原始 IBM PC 架构中的设计缺陷。为了(部分)保护罪人,最初的 8088 实际上并没有使用这个向量 - 然而,它从一开始就被英特尔标记为“保留”。

在发明保护模式之前,这种冲突并没有真正发生(CPU < 80286 不使用这种双重故障)。在当今的大多数 PC 中,8259 PIC 仍然存在,尽管不是作为单独的芯片,而是隐藏在 PC 芯片组中的某个位置。值得庆幸的是,定时器中断的 INT08 没有刻在硬件中,而是由 PC BIOS 初始化到 PIC 中。因此,保护​​模式操作系统可以轻松地将 PIC 中断重新映射到其他更方便的位置,以避免冲突。据我所知,只有DOS和其他早期操作系统采用INT8上的定时器中断。

  • @MargaretBloom 这正是我的回答所说的:INT08 被英特尔“未使用”,但“标记为保留”。但“允许”有点不真实。我不认为使用 CPU 供应商保留的东西是“允许的”。 (3认同)
  • @MargaretBloom:事实是向量 08h 并不是“未使用*”。事实上,它一直被列为 **保留** 一直追溯到英特尔的设计规范文档。英特尔在 8086/8088 上保留了前 32 个中断向量。问题在于IBM忽略了Intel,实际上为8259使用了保留向量。这导致了80286和80386问世时出现的问题(协处理器向量冲突和8259A冲突)。如果IBM从一开始就没有设计一个有缺陷的系统并符合英特尔这个集群故障就不会发生 (2认同)