我正在编写代码来记录 PCI 设备上发生的用户空间中的错误(内核已经将它们记录在内核环形缓冲区中)。目前,我面前有两种方法,
修改内核设备驱动程序以向我的用户空间进程发送中断(使用 eventfd),然后在收到此中断时(使用 select() 或 poll())我可以使用 ioctl 获取详细的错误信息(需要更改设备驱动程序)。这需要更改我想避免的内核代码。
我的进程以 root 身份运行,因此,我可以使用 sysfs 读取/写入设备的错误状态寄存器。为此,我将不得不不断地轮询寄存器,一旦发生错误,我可以读取状态寄存器,对其进行解码,获取详细的错误信息,然后清除寄存器。
我更倾向于第二种方法,因为它只需要在用户空间中进行更改。
我的问题是:
- 第二种方法是否有意义?
- 如果是这样,那么这两种方法的优缺点是什么?
- 第二种方法的轮询将导致 CPU 周期的浪费。在第一种方法中使用 select() 或 poll() 是否也会导致类似比例的 CPU 周期浪费。
非常感谢您的帮助!:)