Меня немного смущает, как работает модуль ядра после загрузки в ядро, в основном из-за вызовов функции sleep.
В качестве примера рассмотрим драйвер символьного устройства. Я видел код, подобный приведенному ниже, в read () функция, которая пытается перевести «процесс» в спящий режим с помощью set_current_state()
(или иногда wait_event_interruptible()
и т.читать (), устанавливая условие в true так:
condition = true;
wake_up_process(task); // -> task was stored inside read() function
У меня есть следующие вопросы:
Какой «процесс» выполняет set_current_state()
или wait_event_interruptible()
уложить спать здесь?Это процесс пользовательского пространства, который вызывает системный вызов read (), или какой-то процесс ядра, созданный для сопоставления процесса пользовательского пространства?
Предполагается, что доступ к этому драйверу устройства ограничен только одним процессомустановив атомный счет в функции open (), и в драйвере устройства не разрешено прерывание, что произойдет, если read () вызовет wait_event () и другой процесс не сможет его разбудить?он застревает навсегда (потому что не прерываемый)?
В чем разница между использованием set_current_state()
и wait_event()
API?Я видел разные фрагменты кода, использующие эти функции соответственно ... какие предпочтения нужно уделять одному другому?