能力值:
( LV2,RANK:10 )
|
-
-
2 楼
中断优先级的问题:
0x1: 单步陷阱处理程序
0x2: NMI不可屏蔽中断
0x3: 调试陷阱处理程序
0x6: 无效操作码陷阱处理程序
0xb: 段不存在陷阱处理程序
0xc: 堆栈错误陷阱处理程序
0xd: 一般保护性错误陷阱处理程序
0xe: 页面错误陷阱处理程序
0x2d: 调试服务陷阱处理程序
0x2e: 系统服务陷阱处理程序
0x31: 8042键盘控制器中断处理程序
0x33: 串口2(Com2)中断处理程序
0x34: 串口1(Com1)中断处理程序
0x37: 并口中断处理程序
0x3c: PS/2鼠标中断处理程序
|
能力值:
( LV6,RANK:90 )
|
-
-
3 楼
不太明白,我是在键盘中断服务程序里面先用 cli关中断,然后往60端口写数据,结果还是会触发键盘中断
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
帮忙顶一下吧
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
不懂RING0,帮顶
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
在汇编里面,CLI命令是设IF位为0,CPU不响应可屏蔽中断(包括键盘中断)
mov al,9H
out 60h,al
向60H端口写入一个字节,这个字节的值即:9h
60H端口是用来存放“键盘按下和松开时所产生的”扫描码
有数据到达60端口之后,相关芯片会向CPU发出中断类型为9的可屏蔽中断信息
这里CPU会检查IF的值,IF=0,则不响应INT 9中断
=====================================================
楼主说,写数据还是会触发中断?不知道指的是什么意思?
|
能力值:
( LV6,RANK:90 )
|
-
-
7 楼
感谢楼上,还是列代码吧,表达准确点:
_declspec(naked) p2cinterruptProc()
{
//以下代码运行在ring0 DIRQL级别
_asm pushad
_asm pushfd
_asm call myKeyBoardISRhook
_asm popfd
_asm popad
_asm jmp OldKeyBoardInterrupteService
}
void myKeyBoardISRhook()
{
UCHAR sch;
_asm in al,0x60
_asm mov sch,al
[COLOR="Red"]_asm cli[/COLOR]
// 把数据写回端口,以便让别的程序可以正确读取。
_asm mov al,0xd2
_asm out 0x64,al
_asm mov al,sch
[COLOR="red"] _asm out 0x60,al[/COLOR]
[COLOR="red"]_asm sti[/COLOR]
}
我用自己的中断函数替换了原有的键盘中断服务例程.譬如按键d,触发键盘中断,系统调用键盘中断服务例程p2cinterruptProc().这里我首先用
_asm in al,0x60
_asm mov sch,al
把扫描码读出来,然后关中断,再把读出的数据写回端口
_asm out 0x60,al
此时 由于已经关了中断,正如楼上所说,这里向60端口写数据cpu是不会响应此中断的,也不会再次调用中断例程.但我实际测试的效果是,当此次中断完成后马上会再次调用中断例程(已经排除了松键产生的中断),形成了一个 死循环..系统跑不出来了
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
此时不响应不应该是把中断丢掉了,不知道楼主从哪里看到“也不会再次调用中断例程“这种描述
高由优先级的中断过程中发生了低优先级的中断,CPU会等高优先级的中断处理完成后再处理低优先级的中断。低优先级的中断过程中发生了高优先级的中断,CPU会直接去执行高优先级的中断,等高优先级的中断处理完成后再重新执行低优先级的中断
所以说“此次中断完成后马上会再次调用中断例程”是合理的
|
能力值:
( LV6,RANK:90 )
|
-
-
9 楼
噢,错误理解cli的行为了,感谢楼上点出来
|
|
|