首页
社区
课程
招聘
xp里 cli不能屏蔽键盘中断
发表于: 2010-1-28 18:29 5008

xp里 cli不能屏蔽键盘中断

2010-1-28 18:29
5008
在ring0里使用
cli
mov al,9h
out 0x60,al
为什么后面的out 0x60写数据还是会触发中断

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 131
活跃值: (10)
能力值: ( 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鼠标中断处理程序
2010-1-29 09:49
0
雪    币: 75
活跃值: (688)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
3
不太明白,我是在键盘中断服务程序里面先用 cli关中断,然后往60端口写数据,结果还是会触发键盘中断
2010-1-29 14:17
0
雪    币: 56
活跃值: (276)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
帮忙顶一下吧
2010-1-30 21:34
0
雪    币: 7
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
不懂RING0,帮顶
2010-1-30 22:54
0
雪    币: 26
活跃值: (10)
能力值: ( 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中断
=====================================================
楼主说,写数据还是会触发中断?不知道指的是什么意思?
2010-2-1 13:20
0
雪    币: 75
活跃值: (688)
能力值: ( 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是不会响应此中断的,也不会再次调用中断例程.但我实际测试的效果是,当此次中断完成后马上会再次调用中断例程(已经排除了松键产生的中断),形成了一个死循环..系统跑不出来了
2010-2-1 13:33
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
此时不响应不应该是把中断丢掉了,不知道楼主从哪里看到“也不会再次调用中断例程“这种描述

高由优先级的中断过程中发生了低优先级的中断,CPU会等高优先级的中断处理完成后再处理低优先级的中断。低优先级的中断过程中发生了高优先级的中断,CPU会直接去执行高优先级的中断,等高优先级的中断处理完成后再重新执行低优先级的中断

所以说“此次中断完成后马上会再次调用中断例程”是合理的
2010-2-1 15:54
0
雪    币: 75
活跃值: (688)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
9
噢,错误理解cli的行为了,感谢楼上点出来
2010-2-1 17:08
0
游客
登录 | 注册 方可回帖
返回
//