免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1572 | 回复: 8
打印 上一主题 下一主题

[中断] 为什么没有触发中断程序 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-10-24 10:01 |只看该作者 |倒序浏览
我看了《LINUX内核API完全手册》中有关中断的例子,
请看(主要部分):
static int irq=10;
static irqreturn_t irq_handler(int data,void *dev_id)
{
        printk("<0>the data is :%d\n",data);
          printk("<0>in the interrupt handler function\n");
           return IRQ_HANDLED;
}

static int __init request_irq_init(void)
{
        int result=0;
        printk("<0>into request_irq_init\n");
        result=request_irq(irq,irq_handler,IRQF_DISABLED,"A_New_Device",NULL);
        disable_irq(irq);
        enable_irq(irq);
        printk("<0>the result of the request_irq is: %d\n",result);   
        printk("<0>out request_irq_init\n");
        return 0;
}

编译没有问题,可是我加载时,没有执行irq_handler函数,书上说只要:
disable_irq(irq);
enable_irq(irq);
就可以触发中断,请问:我错在哪了?

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
2 [报告]
发表于 2013-10-24 11:44 |只看该作者
回复 1# netdoger
不行吧,这里的代码只是申请了irq,设置了handle,enable只是使能中断,即启用中断报告,并不能实际触发中断,实际的中断触发得需要实际的irq line上有中断信号才行,你得确认10号irq上连接的硬件设备,需要该设备触发中断才行。

   

论坛徽章:
0
3 [报告]
发表于 2013-10-24 15:42 |只看该作者
书上说有
disable_irq(irq);
enable_irq(irq);
两个函数就可以了,我也不太清楚,所以想问问各位,我加了,也不行

论坛徽章:
0
4 [报告]
发表于 2013-10-24 15:54 |只看该作者
humjb_1983 发表于 2013-10-24 11:44
回复 1# netdoger
不行吧,这里的代码只是申请了irq,设置了handle,enable只是使能中断,即启用中断报告 ...

有没有办法让它触发?因为不是所有的中断都是硬件中断,还有软件中断,我记得在汇编中,软件中断
可以用int指令来调用,linux中应该也可以吧?

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
5 [报告]
发表于 2013-10-24 16:29 |只看该作者
netdoger 发表于 2013-10-24 15:54
有没有办法让它触发?因为不是所有的中断都是硬件中断,还有软件中断,我记得在汇编中,软件中断
可以用 ...

这个软件怕是不好模拟,原理上说,你需要了解10号irq line上具体有哪些设备(比如某pci设备),然后了解该设备的中断触发方式,比如通过某IO端口,然后通过手工向相应的IO端口中写数据来触发。

论坛徽章:
0
6 [报告]
发表于 2013-10-24 17:12 |只看该作者
请问:linux中的中断都是指硬件中断吗?有没有软件中断呢?如果有,怎么用?

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
7 [报告]
发表于 2013-10-25 09:07 |只看该作者
回复 6# netdoger
再确认了一下,应该可以通过INT指令触发,比如你申请irq号为10,则可以通过INT 42指令触发,42=10+32的偏移,可以试试。


   

论坛徽章:
0
8 [报告]
发表于 2013-10-25 15:06 |只看该作者
humjb_1983 发表于 2013-10-25 09:07
回复 6# netdoger
再确认了一下,应该可以通过INT指令触发,比如你申请irq号为10,则可以通过INT 42指令触 ...


我写了个汇编:
.text
.global _start
_start:
      int $0x2a

      movl $0,%ebx
      movl $1,%eax
      int $0x80

编译后运行,出现:Segmentation fault(core dumped)
然后我把 int $0x2a改成 int $0x0a,编译后运行,出现的
错误也一样。请问:我该怎么做才能触发呢?
(0x2a就是42,0x0a就是10)

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
9 [报告]
发表于 2013-10-28 11:37 |只看该作者
回复 8# netdoger
呵呵,没有实际操作过~
感觉可能需要处理一些上下文,中断触发涉及上下文切换,可能需要考虑的东西还比较多,建议模拟系统调用(int 0x80)相关的代码再调一下~~

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP