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

How can the timer interrupt be 0x08 if the first 32 interrupts are reserved for exceptions?

我正在为 intel i386 开发嵌入式程序,我正在尝试弄清楚如何使用硬件定时器。我读过 here (and other places) that the timer interrupt is 0x08, but this page(以及其他各种来源)说前 32 个中断是为异常保留的,而中断 0x08 专门用于双重故障​​。哪个是真的?如何使用没有操作系统调用的汇编或非常低级的 C 来设置定时器中断处理程序?

我正在开发一个简单的操作系统来学习操作系统开发,所以我无法访问 Linux 或系统调用之类的东西(除非我自己实现系统调用。但是创建一个完整的POSIX-compliant OS 远远超出了这个项目的范围,所以我宁愿坚持简单的,如果有点 hacky,解决方案)。

如果重要的话,我是 运行 QEMU 上的这个,而不是实际的物理 i386。

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

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