我的 IRQ0PIT 滴答声的自定义 ISR 应该发出 int 0x70 吗?

问题描述

所以我正在阅读使用 2 个自定义 ISR(中断服务例程)的引导加载程序的源代码,一个用于 IRQ0(可编程间隔定时器滴答),另一个用于 IRQ1(键盘),以及IRQ0 的 ISR 是 int 0x70,我搜索了一段时间关于这个 int,我发现它与 CMOS-RTC 有关,但是来自 osdev :

The RTC keeps track of the date and time,even when the computer's power is off.

所以这意味着 RTC 是独立于系统的,所以我为什么要触发这个 int ?

我还注意到一些奇怪的事情,IRQ0 的 ISR 没有发送 End-Of-Interrupt 信号,但是 boodloader 工作正常,键盘中断处理正常。但是如果删除该特定行(int 0x70),键盘中断将被忽略,我将需要添加指令以在 ISR 中的每个 End-Of-Interrupt 之前发送 iret 信号(有很多,它有一些本地标签,每个标签都有它的 iret 执行流程在这些条件之后转移到这个标签)考虑到引导加载程序的大小限制(510 字节 + 魔术字)作者是否使用这个技巧来省略使用指令大小~6 字节发送 End-Of-Interrupt 信号还是只是巧合,int 0x70 用于其他用途? int 0x70 有什么作用,为什么在为 IRQ0 创建自己的 ISR 时需要它?

代码是这样的:

;; es is set to 0
;; edit the IVT
cli
mov [es:0x08*4],word pit_isr
mov [es:0x08*4+2],cs
mov [es:0x09*4],word keyboard_isr
mov [es:0x09*4+2],cs
sti

[...]
keyboard_isr:
     do_isr_stuffs
     [....]
     ;; send end of interrupt signal:
     mov al,0x61
     out 0x20,al

pit_isr:
     .tick_rtc:
           int 0x70
     .label_one:
           do_stuff
           [....]
           iret
     .label_two:
           do_stuff
           [....]
           iret
     [...]
     iret           

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...