修改键盘中断向量(IRQ1)以截获失败,贴源码求助
时间:2006-03-24
来源:互联网
小弟近来想来测试中断响应时间,想出一个不太好的法子如下:通过修改键盘中断向量,使其指向截获模块,在此模块内得出系统时间,然后再转入原中断向量。另外通过加载自己的简间键盘驱动模块,在此模块内只得到系统时间后返回(同时禁掉原有模块)。但现在遇到了问题:在修改键盘中断向量时老出错,还望各位大侠帮忙看看,救急呀。
static unsigned long stub;
struct {
unsigned short limit;
unsigned long base;
}
struct descriptor-idt
{
unsigned short offset_low,selector;
unsigned char reserved,flag;
unsigned short offset_high;
}*idte;
void intercept(void)
{
__asm__("rdtsc \n"
:"=a"(low),"=d"(high));
printk("<1>the time is %ld%ld",high,low);
__asm__("jmp *stub");
}
int init_module()
{
__asm__ ("sidt %0" :"=m"(idtr));
idte=(struct descriptor_idt *)(idtr.base+8*0x21);
stub=(idte->offset_high<<16|idte->offset_low);
idte->offset_high=(unsigned short)((unsigned long)intercept>>16);
idte->offset_low=(unsigned short)((unsigned long)intercept&0x0000ffff);
}
请教各位大哥出出主意呀,有条件的帮忙调试看看,不胜感激。(注,以上仅为修改中断向量部分)
另外发现通过这样得出的地址值与系统中System.map中的值有出入呀,不知为什么,比如得出system_call地址值为c010912c,但在system.map中地址值为c0109325。它们的值难道不会相等吗,不解!
static unsigned long stub;
struct {
unsigned short limit;
unsigned long base;
}
struct descriptor-idt
{
unsigned short offset_low,selector;
unsigned char reserved,flag;
unsigned short offset_high;
}*idte;
void intercept(void)
{
__asm__("rdtsc \n"
:"=a"(low),"=d"(high));
printk("<1>the time is %ld%ld",high,low);
__asm__("jmp *stub");
}
int init_module()
{
__asm__ ("sidt %0" :"=m"(idtr));
idte=(struct descriptor_idt *)(idtr.base+8*0x21);
stub=(idte->offset_high<<16|idte->offset_low);
idte->offset_high=(unsigned short)((unsigned long)intercept>>16);
idte->offset_low=(unsigned short)((unsigned long)intercept&0x0000ffff);
}
请教各位大哥出出主意呀,有条件的帮忙调试看看,不胜感激。(注,以上仅为修改中断向量部分)
另外发现通过这样得出的地址值与系统中System.map中的值有出入呀,不知为什么,比如得出system_call地址值为c010912c,但在system.map中地址值为c0109325。它们的值难道不会相等吗,不解!
作者: qqrilxk 发布时间: 2006-03-24
另外“玩转IDT”中采用了类似如下的形式:
void stub(void)
{
__asm__(".globl mystub \n"
".align 4,90 \n"
".mystub: \n"
.......
);
然后在init_module中使用,
可gcc说mystub“未申明,什么第一次使用未定义吧”反正就是这一类的话,唉,不知这是为什么呀,有哪位大哥知道告诉小弟哟,还有在void stub(void)前加个asmlinkage,GCC就报错说void前有语法错误,这是怎么回事,大哥们帮忙呀,谢谢了!
void stub(void)
{
__asm__(".globl mystub \n"
".align 4,90 \n"
".mystub: \n"
.......
);
然后在init_module中使用,
可gcc说mystub“未申明,什么第一次使用未定义吧”反正就是这一类的话,唉,不知这是为什么呀,有哪位大哥知道告诉小弟哟,还有在void stub(void)前加个asmlinkage,GCC就报错说void前有语法错误,这是怎么回事,大哥们帮忙呀,谢谢了!
作者: qqrilxk 发布时间: 2006-03-24
把程序改写如下都不行呀,
void stub(void)
{
__asm__ volatile(
".align 4,90 \n\t"
"jmp *old_stub"
);
}
int init_module()
{
__asm__ ("sidt %0" :"=m"(idtr));
idte=(struct descriptor_idt *)(idtr.base+8*0x21);
old_stub=(idte->offset_high<<16|idte->offset_low);
idte->offset_high=(unsigned short)((unsigned long)stub>>16);
idte->offset_low=(unsigned short)((unsigned long)stub&0x0000ffff);
}
这样都不行呀,真是郁闷,我想这样做应该不会对内核桟造成影响吧,到底是哪错了呀,唉,唉,都改了好久了,有时加载后系统能接受一个按键输入显示,然后就死机,想来想去,是不是中断返回后出错呀,大牛们都哪去了呀!5555555555555555555
void stub(void)
{
__asm__ volatile(
".align 4,90 \n\t"
"jmp *old_stub"
);
}
int init_module()
{
__asm__ ("sidt %0" :"=m"(idtr));
idte=(struct descriptor_idt *)(idtr.base+8*0x21);
old_stub=(idte->offset_high<<16|idte->offset_low);
idte->offset_high=(unsigned short)((unsigned long)stub>>16);
idte->offset_low=(unsigned short)((unsigned long)stub&0x0000ffff);
}
这样都不行呀,真是郁闷,我想这样做应该不会对内核桟造成影响吧,到底是哪错了呀,唉,唉,都改了好久了,有时加载后系统能接受一个按键输入显示,然后就死机,想来想去,是不是中断返回后出错呀,大牛们都哪去了呀!5555555555555555555
作者: qqrilxk 发布时间: 2006-03-24
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28