2

在内核域中处理 IRQ 后,我需要重新启动。

我想调用/sbin/reboot二进制文件,但由于 IRQ 范围而受到限制。

代码如下:

#define MY_IRQ_ID       42

void __init             rebootmodule_init(void) {
    request_any_context_irq(MY_IRQ_ID, rebootmodule_irq_handler, IRQF_TRIGGER_FALLING, "irq-name", NULL);
}

irqreturn_t             rebootmodule_irq_handler(int irq, void *dev_id) {
    my_reboot();
    return IRQ_HANDLED;
}

void                    my_reboot(void) {
    int                 ret;
    char                *argv[2], *envp[4];

    argv[0] = "/sbin/reboot";
    argv[1] = NULL;
    envp[0] = "HOME=/";
    envp[1] = "PWD=/";
    envp[2] = "PATH=/sbin";
    envp[3] = NULL;
    ret = call_usermodehelper(argv[0], argv, envp, 0);
    printk(KERN_INFO "trying to reboot (ret = %d)", ret);
}

我可以看到printk(...)触发 IRQ 的时间,但我有一些错误,即使我替换/sbin/reboot/bin/rm /tmp/its-not-working.

我测试了其他重启方法,比如mvBoardReset(), machine_halt(), arm_pm_restart(), pm_power_off(), kill(1, SIGTSTP), reboot(), handle_sysrq('b'), 我总是遇到在 IRQ 范围之外没有的错误。

我真的很想打电话/sbin/reboot,因为它确实是干净的软重置。

感谢您的时间。

4

1 回答 1

5

只是一个想法:您可以通过 启动内核线程,通过kthread_run()将其置于睡眠状态,通过 将其wait_event()在 IRQ 处理程序中唤醒,在内核线程中wake_up()执行您的操作(运行/sbin/reboot或任何您想要的)。像这样的东西(完全未经测试):

#define MY_IRQ_ID 42

static DECLARE_WAIT_QUEUE_HEAD(wq);
static volatile int showtime = 0;

void my_reboot(void) {
    int ret;
    char *argv[2], *envp[4];

    argv[0] = "/sbin/reboot";
    argv[1] = NULL;
    envp[0] = "HOME=/";
    envp[1] = "PWD=/";
    envp[2] = "PATH=/sbin";
    envp[3] = NULL;
    ret = call_usermodehelper(argv[0], argv, envp, 0);
    printk(KERN_INFO "trying to reboot (ret = %d)", ret);
}

static int my_thread(void *arg) {
    wait_event(&wq, showtime);
    my_reboot();
    return 0;
}

irqreturn_t rebootmodule_irq_handler(int irq, void *dev_id) {
    showtime = 1;
    wake_up(&wq);
    return IRQ_HANDLED;
}

void __init rebootmodule_init(void) {
    kthread_run(my_thread, NULL, "my_module");
    request_any_context_irq(MY_IRQ_ID, rebootmodule_irq_handler, IRQF_TRIGGER_FALLING, "irq-name", NULL);
}

不要忘记处理模块以及在内核线程被发送到睡眠之前__exit中断已经到来的情况。

于 2012-03-16T02:07:27.147 回答