免费注册 查看新帖 |

Chinaunix

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

[中断] x86_64构架,请问有什么办法可以软件模拟外部中断? [复制链接]

论坛徽章:
3
15-16赛季CBA联赛之山东
日期:2016-10-30 08:47:3015-16赛季CBA联赛之佛山
日期:2016-12-17 00:06:31CU十四周年纪念徽章
日期:2017-12-03 01:04:02
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-10-27 16:43 |只看该作者 |倒序浏览
Makefile:

  1. ifneq ($(KERNELRELEASE),)
  2. obj-m += demo.o
  3. else
  4. PWD := $(shell pwd)
  5. KVER := $(shell uname -r)
  6. KDIR := /lib/modules/$(KVER)/build

  7. all:
  8.         $(MAKE) -C $(KDIR) M=$(PWD) modules

  9. clean:
  10.         $(MAKE) -C $(KDIR) M=$(PWD) modules clean
  11. endif
复制代码

demo.c:

  1. #include <linux/module.h>
  2. #include <linux/init.h>

  3. #include <linux/interrupt.h>
  4. #include <linux/irq.h>

  5. #define my_debug(fmt, args...) printk("[%s]"fmt, __FUNCTION__, ##args)

  6. MODULE_LICENSE("GPL");

  7. static irqreturn_t irq_handler(int irq, void *dev_id)
  8. {
  9.         my_debug("the interrupt handler function.\n");
  10.         my_debug("the irq is: %d\n", irq);

  11.         return IRQ_HANDLED;
  12. }

  13. static int irq = 10;

  14. static int __init test_init(void)
  15. {
  16.         unsigned int ret = 0;

  17.         my_debug("enter module init...\n");

  18.         ret = request_irq(irq, irq_handler, IRQF_DISABLED, "demo_dev", NULL);
  19.         if (ret < 0) {
  20.                 my_debug("request_irq failed, ret = %d\n", ret);
  21.                 goto err0;
  22.         }

  23.         my_debug("request_irq ret = %d\n", ret);
  24.         my_debug("exit module init.\n");

  25. err0:
  26.         return ret;
  27. }

  28. static void __exit test_exit(void)
  29. {
  30.         free_irq(irq, NULL);
  31.         my_debug("module exit...\n");
  32. }

  33. module_init(test_init);
  34. module_exit(test_exit);
复制代码

这个简单模块是写在 PC 平台的。
请教用什么(软件)手段,可以让 irq_handler 被调用到呢?


论坛徽章:
3
15-16赛季CBA联赛之山东
日期:2016-10-30 08:47:3015-16赛季CBA联赛之佛山
日期:2016-12-17 00:06:31CU十四周年纪念徽章
日期:2017-12-03 01:04:02
2 [报告]
发表于 2016-10-28 13:21 |只看该作者
自己顶一下。
给个思路或者判定是否可以做到,如果做不到的话主要因为什么,如果可以那么大概应该怎么做也可以。
贴子先放这里,如果我自己能确认之后,一定回来补坑。

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
3 [报告]
发表于 2016-10-28 14:36 |只看该作者
有些硬件是可以通过写IRC寄存器来人为触发中断的。
不过好像没有回答楼主的问题。

论坛徽章:
3
15-16赛季CBA联赛之山东
日期:2016-10-30 08:47:3015-16赛季CBA联赛之佛山
日期:2016-12-17 00:06:31CU十四周年纪念徽章
日期:2017-12-03 01:04:02
4 [报告]
发表于 2016-10-28 15:50 |只看该作者
nswcfd 发表于 2016-10-28 14:36
有些硬件是可以通过写IRC寄存器来人为触发中断的。
不过好像没有回答楼主的问题。

嗯,挺好的。我也是这么想。不过目前对 x86_64 硬件构架体系以及这块涉及的代码研究还不多,所以暂时还不知道怎么做或者没有明确答案。我觉得以后我要是能搞定这个了就来回个帖子吧。毕竟针对特定体系构架的特定实现,加上 x86 本就繁琐,也是不容易回答^_^

论坛徽章:
0
5 [报告]
发表于 2016-11-02 11:57 |只看该作者
找一个不常用的中断,比如rtc,然后模块里request_irq带shared参数
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP