таймер сигнализирует процессу, который добавляет его и выводит из прерывистого сна - PullRequest
0 голосов
/ 04 июня 2018

Я изучаю драйверы устройств Linux и, в частности, таймеры и очереди ожидания.Я хочу, чтобы они работали вместе в одном символьном драйвере, где я могу перевести драйвер в спящий режим с помощью команды управления вводом-выводом, в то время как я продолжаю получать прерывания fasync на земле пользователя с помощью таймера.Я заметил, что если я использую

wait_event_interruptible();

, то после истечения времени таймера драйвер выходит из режима ожидания с кодом возврата -512, даже если условие еще не выполнено.Но если я использую

wait_event();

, тогда проблема решена.Я прочитал, что wake_up_event_interruptible () возвращает ненулевой код возврата, если прерывание пробуждает процесс.

я правильно понимаю, что таймер прерывает процесс, который его добавляет (я не могу найти никаких доказательств этого в текстах) какиз моего понимания функция таймера становится независимой от состояния процесса, который ее добавил.

1 Ответ

0 голосов
/ 04 июня 2018

С код для wait_event_interruptible : функция wake_up_event_interruptible() возвращает -ERESTARTSYS (т. Е. -512), когда ожидается сигнал для текущего процесса ядра.

Таймер ядра (добавлен с setup_timer) прерывает выполнение текущего процесса ядра независимо от его состояния.Чтобы быть более точным, начиная с здесь , ядро ​​имеет три очереди: очереди задач, тасклеты (начиная с ядра 2.3.43) и таймеры ядра.(Простыми словами), когда истекает таймер ядра, ЦП переходит к процедуре обработки прерывания, которая сохраняет текущий контекст и переходит к зарегистрированной таймером функции обратного вызова.После обработки прерывания планировщик решает, какую задачу запустить ЦП.

...