Я пишу код для регистрации ошибок в пользовательском пространстве, возникающих на устройстве PCI (ядро уже регистрирует их в кольцевом буфере ядра). В настоящее время у меня есть два подхода передо мной,
Измените драйвер устройства ядра, чтобы отправить прерывание в мой процесс пользовательского пространства (используя eventfd), а затем, получив это прерывание (используя select() или poll()), я могу получить подробную информацию об ошибке, используя ioctl (потребуется изменение в драйвере устройства ). Это требует изменений в коде ядра, которых я хотел бы избежать.
Мой процесс работает как root, поэтому я могу читать/записывать регистры состояния ошибок устройства, используя sysfs. Для этого мне придется постоянно опрашивать регистры, и как только произойдет ошибка, я смогу прочитать регистр состояния, расшифровать его, получить подробную информацию об ошибке, а затем очистить регистры.
Я больше склоняюсь ко второму подходу, так как он требует изменений только в пользовательском пространстве.
Мои вопросы:
- Имеет ли смысл второй подход?
- Если да, то каковы плюсы и минусы обоих подходов?
- Опрос во втором подходе приведет к пустой трате циклов ЦП. Приводит ли использование select() или poll() в первом подходе к потерям циклов ЦП в аналогичных пропорциях.
Полезный ответ будет принят с благодарностью! :)