我正在编写代码来记录PCI设备上发生的用户空间中的错误(内核已经将它们记录在内核环缓冲区中)。目前,我面前有两种方法,
修改内核设备驱动程序以向我的用户空间进程发送中断(使用eventfd)然后在收到此中断时(使用select()或poll())我可以使用ioctl获取详细的错误信息(将需要更改设备驱动程序)。这需要更改内核代码,我希望避免这种情况。
我的进程以root身份运行,因此,我可以使用sysfs读取/写入设备的错误状态寄存器。为此,我将不断轮询寄存器,一旦发生错误,我可以读取状态寄存器,对其进行解码,获取详细的错误信息,然后清除寄存器。
我更倾向于第二种方法,因为它只需要在用户空间中进行更改。
我的问题是:
有用的回复将不胜感激! :)
答案 0 :(得分:1)
第二种方法是丑陋的憎恶。 在您的特定情况下是否有意义只有您可以决定。
驱动程序的目的是封装和控制硬件访问。 使用第二种方法时,驱动程序和进程可能需要知道另一方可能会干扰设备。
你说你“想避免”改变内核代码。 你不说为什么;原因可能是合理的,或不是。
如果循环查询设备,驱动程序会浪费CPU。 通过中断,CPU可以休眠。
答案 1 :(得分:0)
在常量轮询模式下读/写状态寄存器不是一个好主意。检查读取状态寄存器的功能,因为这通常是在一个关键部分完成的,在这种情况下,在访问状态寄存器时会有很多锁定/解锁,还有一次又一次的系统调用开销(一个softirq) 。
因此,驱动程序向错误状态发送异步事件到用户空间的第一个想法是更好的方法。