我正在编写一个用户空间程序和一个内核空间设备驱动程序。
目标:一旦发生中断,用户空间程序需要快速做一些事情。
我的幼稚方法:用户空间程序使用ioctl调用wait_event_interruptible(),内核ISR调用wake_up_interruptible()唤醒用户空间程序。事实证明,从中断到用户空间需要太多时间。
有没有更好的办法?
谢谢!
这里有一个类似的问题:
请检查上述问题。但是,我可以提供我在那里建议的方法。
您可以从内核 API 向用户空间线程发送信号,这可以帮助您运行非阻塞:
send_sig(int sig, struct task_struct *p, int priv);
您需要了解内核中用户线程的 pid。您可以通过 /proc 写入用户进程的 pid 然后内核读取 pid 来解决这个问题。通过这种安排,当有中断时,内核可以向用户线程发送信号。如果您的进程重新启动或被杀死,您将不得不通过 proc 更新 pid。仅用于状态通知,您可以使用此方法;但是,如果您希望将数据与状态一起传输,则 Netlink 或 char 驱动机制是个好方法。