中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

中国DOS联盟论坛
现在时间是 2026-06-16 13:54
中国DOS联盟论坛 » DOS开发编程 & 发展交流 (开发室) » 请教DJGPP下挂中断的问题. 查看 1,404 回复 1
楼 主 请教DJGPP下挂中断的问题. 发表于 2003-06-12 00:00 ·  中国 陕西 西安 教育网
初级用户
积分 109
发帖 1
注册 2003-06-11 00:00
UID 4843
性别 男
状态 离线
__dpmi_set_protected_mode_interrupt_vector如何用?好像还得锁内存?是不是很繁琐啊?
这个函数和__go32_dpmi_chain_protected_mode_interrupt_vector有什么区别?我的程序有两个中断,用chain函数会出问题。

请哪位大侠指点一二!
谢谢!
2 发表于 2003-07-09 00:00 ·  新加坡 星和视界(StarHub)宽带
初级用户
积分 169
发帖 29
注册 2003-07-09 00:00
UID 6654
性别 男
状态 离线
建议使用_go32_xxx之类的函数来处理c写的中断isr。在djgpp的faq写的很清楚了。
关于chain,应该避免使用,因为它会调用旧的isr。如果在其中有real mode的指令就会有模式切换发生,极大影响效率。
isr中的变量和isr本身的代码段都应该lock,一般有如下宏:
#define END_FUNCTION(x) void x##_end(){}
#define LOCK_VARIABLE(x) _go32_dpmi_lock_data((void *)&x, (long)sizeof(x));
#define LOCK_FUNCTION(x) _go32_dpmi_lock_code(x, (long)x##_end - (long)x);
...
void my_isr(void)
{
...
outp(0x20, 0x20);
}
END_FUNCTION(my_isr);
...
中断初始化部分:
_go32_dpmi_seginfo OldISR, NewISR;
LOCK_FUNCTION(my_isr);
LOCK_VARIABLE(my_variable);
...
_go32_dpmi_get_protected_mode_interrupt_vector(IRQNum, &OldISR);
NewISR.pm_offset = (int)my_isr;
NewISR.pm_selector = _go32_my_cs();
_go32_dpmi_set_protected_mode_interrupt_vector(IRQNum,&NewISR);
//还有设置中断的掩码,outp(0x21, inp(0x21) & xxH);
...
// main loop here
...
_go32_dpmi_set_protected_mode_interrupt_vector(IRQNum, &OldISR);

应该尽量避免模式切换,所以要避免直接或间接调用dos/bios功能。


论坛跳转: