Chinaunix

标题: x86_64构架,请问有什么办法可以软件模拟外部中断? [打印本页]

作者: captivated    时间: 2016-10-27 16:43
标题: x86_64构架,请问有什么办法可以软件模拟外部中断?
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 被调用到呢?



作者: captivated    时间: 2016-10-28 13:21
自己顶一下。
给个思路或者判定是否可以做到,如果做不到的话主要因为什么,如果可以那么大概应该怎么做也可以。
贴子先放这里,如果我自己能确认之后,一定回来补坑。
作者: nswcfd    时间: 2016-10-28 14:36
有些硬件是可以通过写IRC寄存器来人为触发中断的。
不过好像没有回答楼主的问题。
作者: captivated    时间: 2016-10-28 15:50
nswcfd 发表于 2016-10-28 14:36
有些硬件是可以通过写IRC寄存器来人为触发中断的。
不过好像没有回答楼主的问题。

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


作者: chenyu105    时间: 2016-11-02 11:57
找一个不常用的中断,比如rtc,然后模块里request_irq带shared参数




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2