Я хотел бы написать модуль ядра FreeBSD, который мог бы принимать некоторые произвольные прерывания и при получении этих прерываний выводить некоторые данные на произвольное устройство. В настоящее время я столкнулся с несколькими проблемами:
Как я могу получать прерывания через определенный IRQ? В Linux есть вызов
request_irq()
, но, похоже, подобного API для FreeBSD нет... Скажем, я хочу иметь возможность обнаруживать все прерывания клавиатуры через мой модуль ядра (клавиатура на irq1), как мне это сделать? (В Linux это возможно через вызовfree_irq(1, NULL)
иrequest_irq(1, ...)
, поправьте меня, если я ошибаюсь).Можно ли вообще писать в файл устройства в /dev через модуль ядра? Я прочитал вопрос Пример чтения текстовых файлов в ядре FreeBSD модуль; следуя этому примеру, я смог читать/записывать обычные файлы, но не файл устройства в /dev («устройство» было псевдо "echo device", классический, используемый в примерах char). Однако я смог открыть файл.
Я понимаю, что выполнение файлового ввода-вывода в ядре считается плохой практикой, но я не мог думать иначе... Если у кого-то есть лучшее решение, пожалуйста скажите мне. (т.е. писать на устройство через его узелdevice_t
?)
Причина, по которой я делал это в ядре, заключается в том, что мне действительно нужно, чтобы все прерывания срабатывали, а запуск его в пользовательском пространстве сопряжен с риском пропуска прерываний из-за того, что потоки ядра вытесняют пользовательские потоки (прерывания могут возникать очень часто).
Я также был бы признателен, если бы кто-нибудь мог дать мне другие идеи о том, как реализовать эту программу (в основном, идея заключается в модуле ядра, который мог бы выполнять работу микроконтроллера...)