【问题标题】:How kernel notify a user space program an interrupt occurrs内核如何通知用户空间程序发生中断
【发布时间】:2012-10-15 15:36:35
【问题描述】:

我正在编写一个用户空间程序和一个内核空间设备驱动程序。

目标:一旦发生中断,用户空间程序需要快速做某事。

我的幼稚方法:用户空间程序使用ioctl调用wait_event_interruptible(),内核ISR调用wake_up_interruptible()唤醒用户空间程序。事实证明,从中断到用户空间的时间太长了。

有没有更好的办法?

谢谢!

【问题讨论】:

  • 你有没有使用nice来提高程序的优先级?
  • 我正在使用 uClinux。没有“好”的命令。但是,我确实尝试使用 sched_get_priority_max();sched_setscheduler();在我的用户空间程序中,但它并没有真正帮助。 :(
  • busyboxnicerenicechpst。如果启用了这些小程序中的任何一个,您可以使用它们以不同的优先级运行您的用户空间程序。它是否以 root 身份运行(只有超级用户可以提高优先级)?
  • 我会在内核驱动程序中使用一个专用的字符设备来向应用程序发送信号(应该poll(2)那个设备)。
  • 谢谢 Ben,我刚刚在busybox 中找到了“不错”的选项。我稍后试试!

标签: linux interrupt


【解决方案1】:

这里有一个类似的问题:

Notify gpio interrupt to user space from a kernel module

请检查上述问题。但是,我可以提供我在那里建议的方法。

您可以从内核 API 向用户空间线程发送信号,这可以帮助您运行非阻塞:

send_sig(int sig, struct task_struct *p, int priv);

您需要了解内核中用户线程的 pid。您可以通过 /proc 写入用户进程的 pid 然后内核读取 pid 来克服这个问题。通过这种安排,当有中断时,内核可以向用户线程发送信号。如果您的进程重新启动或被杀死,您将不得不通过 proc 更新 pid。仅用于状态通知,您可以使用此方法;但是,如果您希望将数据与状态一起传输,则 Netlink 或 char 驱动机制是不错的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 2014-08-18
    • 1970-01-01
    • 2011-12-30
    • 2013-02-23
    • 2011-12-29
    • 1970-01-01
    相关资源
    最近更新 更多