カーネルの土地でIRQを処理する際に再起動する必要があります。IRQスコープの非モノリシックカーネルモジュールからソフトリブートする方法はありますか?
私は/sbin/reboot
バイナリに電話しますが、IRQスコープのため制限があります。
コードは次のとおりです。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);
}
私は/bin/rm /tmp/its-not-working
で/sbin/reboot
を交換する場合でも、printk(...)
を見ることができます。私はmvBoardReset()
、machine_halt()
、arm_pm_restart()
、pm_power_off()
、kill(1, SIGTSTP)
、reboot()
、handle_sysrq('b')
のように再起動を行うには、他の方法をテストした
、私はいつも私がIRQの範囲外ではありませんエラーを持っています。
私は本当に/sbin/reboot
に電話したいと思っています。それはで、ソフトリセットです。
ありがとうございます。
私はそれを同じ方法で修正しました:) https://github.com/moul/junk/blob/master/kernel/irq_reboot.c – moul