割り込み
linux kernel で割り込みを扱う
- request_irq() で割り込みハンドラインストール
- free_irq() で割り込みハンドラアンインストール
以下、最小限コード。LINUXデバイスドライバ第3版 の記述から request_irq() と割り込みハンドラの I/F が変更されています。
- PC上で insmod mykmod.ko irq=12 としてカーネルモジュールをインストール後、マウスを動かす度にカーネルメッセージが大量に出力されます。
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/jiffies.h>
#include <linux/interrupt.h>
#define DEV_NAME "mykmod"
static int irq = 14;
static char *id = "mykmod-irq";
module_param(irq, int, S_IRUGO);
static irqreturn_t mykmod_irq_handler(int irq, void *dev_id)
{
pr_info("[%s]IRQ:%d dev:%s jiffies:%ld\n",
__func__, irq, (char *)dev_id, jiffies);
return IRQ_NONE;
}
static int __devinit mykmod_init(void)
{
int ret;
pr_info("mykmod init\n");
ret = request_irq(irq, mykmod_irq_handler, IRQF_SHARED, DEV_NAME, id);
if (ret < 0) {
return -EBUSY;
}
return 0;
}
static void __devexit mykmod_exit(void)
{
free_irq(irq, id);
pr_info("mykmod exit\n");
}
module_init(mykmod_init);
module_exit(mykmod_exit);
MODULE_DESCRIPTION("mykmod");
MODULE_LICENSE("GPL");
割り込みハンドラ内で(やってはいけない|できない)こと。
- スリープ(wait_event()など)
- ユーザー空間とのデータのやりとり
- メモリ割り当て、ただしGFP_ATOMICフラグを付加すればOK
- セマフォのロック
- schedule()コール