Chinaunix
标题:
x86_64构架,请问有什么办法可以软件模拟外部中断?
[打印本页]
作者:
captivated
时间:
2016-10-27 16:43
标题:
x86_64构架,请问有什么办法可以软件模拟外部中断?
Makefile:
ifneq ($(KERNELRELEASE),)
obj-m += demo.o
else
PWD := $(shell pwd)
KVER := $(shell uname -r)
KDIR := /lib/modules/$(KVER)/build
all:
$(MAKE) -C $(KDIR) M=$(PWD) modules
clean:
$(MAKE) -C $(KDIR) M=$(PWD) modules clean
endif
复制代码
demo.c:
#include <linux/module.h>
#include <linux/init.h>
#include <linux/interrupt.h>
#include <linux/irq.h>
#define my_debug(fmt, args...) printk("[%s]"fmt, __FUNCTION__, ##args)
MODULE_LICENSE("GPL");
static irqreturn_t irq_handler(int irq, void *dev_id)
{
my_debug("the interrupt handler function.\n");
my_debug("the irq is: %d\n", irq);
return IRQ_HANDLED;
}
static int irq = 10;
static int __init test_init(void)
{
unsigned int ret = 0;
my_debug("enter module init...\n");
ret = request_irq(irq, irq_handler, IRQF_DISABLED, "demo_dev", NULL);
if (ret < 0) {
my_debug("request_irq failed, ret = %d\n", ret);
goto err0;
}
my_debug("request_irq ret = %d\n", ret);
my_debug("exit module init.\n");
err0:
return ret;
}
static void __exit test_exit(void)
{
free_irq(irq, NULL);
my_debug("module exit...\n");
}
module_init(test_init);
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