问题描述
所以我正在阅读使用 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 (将#修改为@)