Я пишу модуль ядра, который использует настроенную систему печати на экране. Обычно каждый раз, когда задействовано print
, строка вставляется в связанный список.
Каждые X секунд мне нужно обрабатывать список и выполнять некоторые операции со строками перед их печатью.
В принципе, у меня есть два варианта реализации такого фильтра:
1) Таймер (который перезапускается в конце)
2) Нить ядра, которая спит в течение X секунд
Пока фильтр выполняет свои функции, ничто другое не может использовать связанный список и, конечно же, при вставке строки функция фильтра должна ждать.
Таймер AFAIK работает в контексте прерывания, поэтому он не может спать, но как быть с потоками ядра? Могут ли они спать? Если да, есть ли причина не использовать их в моем проекте? Какое еще решение можно использовать?
Подводя итог: моя функция фильтра имеет только 3 требования:
1) Должен уметь printk
2) При использовании списка все остальные, которые пытаются получить доступ к списку, должны блокироваться, пока функция фильтра не завершит выполнение
3) Должен запускаться каждые X секунд (не в режиме реального времени)