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()コール