LINUX.ORG.RU

reset/poweroff из модуля ядра

 , ,


0

2

Привет!

Очередной нубовопрос: как можно из модуля ядра перезагрузить/выключить машину? Сейчас у меня на embedded устройстве есть такой велосипед:

static irqreturn_t power_interrupt(int irq, void *dummy)
{
    struct task_struct *current_task = NULL;
    if (__raw_readl(GPIO_P3_INP_STATE(GPIO_IOBASE)))
    {
        list_for_each_entry(current_task, &init_pid_ns.child_reaper->tasks, tasks)
        {
            if (strcmp(current_task->comm, APP1) == 0)
            {
                kill_proc_info(SIGTERM, SEND_SIG_PRIV, current_task->pids[PIDTYPE_PID].pid->numbers[0].nr);
                printk(KERN_INFO "Power button: SIGTERM is sent to app.\n");
                return IRQ_HANDLED;;
            }
        }
    }
    printk(KERN_INFO "Poweroff is coming.\n");
    kill_proc_info(SIGUSR2, SEND_SIG_PRIV, 1);
    return IRQ_HANDLED;
}

Логика тут следующая: попадаем в обработчик прерывания, которое срабатывает при нажатии на кнопку; на железе крутится программа APP1, которой шлем SIGTERM, а затем шлем SIGUSR2 процессу с пидом 1. Собственно пока я таким образом и выключаю девайс.

Есть ли более кошерные способы выключения? Как мне перезагрузить систему из модуля ядра?

★★★★★

Последнее исправление: CYB3R (всего исправлений: 1)

Мне кажется это не очень хорошая идея. Как правило в системе работает не один процесс и хорошо бы все процессы перед завершением работы корректно остановить, сохранить изменения в файлах, размонтировать файловые системы и тому подобное.

imb ★★
()
Ответ на: комментарий от imb

сохранить изменения в файлах, размонтировать файловые системы

это делает большая и умная пользовательская программа, которая ловит SIGTERM. но я согласен с тем, что это решение грязное.

ymn ★★★★★
() автор топика

на железе крутится программа APP1, которой шлем SIGTERM

Может в программе APP1 обработать SIGTERM и сделать там что-нибудь типа exec («reboot»)?

solovey ★★
()
Ответ на: комментарий от ymn

Я привел ACPI как пример. Имеется в виду например обновлять какой-то файлик в /proc . А твоя программа будет за ним следить. Или организовать какой-то FIFO из ядра в юзерспейс.

OxiD ★★★★
()
7 мая 2014 г.
Ответ на: комментарий от joy4eg

Файл - устройство в /dev + select из userspace(состояние изменилось - ребут)

free_serj ★★
()
Последнее исправление: free_serj (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.