2

我有一个 PCIe 设备,它会在数据缓冲区准备好读取时发送硬件中断。我相信最好的方法是使用信号,但我不完全确定如何。我认为我需要做的是:

  1. 保存用户空间应用程序的 PID,以便驱动程序知道将信号发送到哪里
  2. 在 PCIe 设备驱动程序的中断处理程序中,向用户空间应用程序发送信号
  3. 在用户空间应用程序中实现一个信号处理函数来处理信号

我不知道该怎么做。如何/在哪里保存用户空间应用程序的 PID?如何从驱动程序的中断处理程序向该特定 PID 发送信号(我相信我应该使用 kill 命令,但我对获取 PID 的语法更感兴趣)?如何让用户空间应用程序在保存其 PID 后等待信号?是否可以让用户空间应用程序在保存其 PID 后继续运行,在收到信号时运行信号处理函数,并在信号到达之前继续运行?(类似于 ISR 的工作方式)

4

3 回答 3

2

不要为此使用信号。实现一个字符设备。用户空间应用程序将open调用它,然后调用read并将被阻止,直到您的驱动程序确定有可用数据。

我认为请参阅Linux 设备驱动程序第 3 章。

于 2012-07-06T19:07:23.440 回答
0

必须直接在内核中处理中断。为了将 PID 传递给内核,必须使用设备文件抽象(例如ioctl()调用),但它也通过读取/选择提供异步通知,因此信号解决方案被替换。

于 2017-12-12T17:20:42.500 回答
0

这是一个老问题,但要从应用程序用户空间管理 IRQ,现在更好的方法是使用 UIO 驱动程序并在 /dev/uioX 上进行轮询/选择调用。

于 2017-12-13T10:00:53.857 回答