【问题标题】:How do I inform a user space application that the driver has received an interrupt in linux?如何通知用户空间应用程序驱动程序已收到 linux 中的中断?
【发布时间】:2012-07-06 17:01:09
【问题描述】:

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

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

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

【问题讨论】:

  • 不确定信号是否是正确的方法。也许 char 设备更适合这里?然后用户空间应用程序可以使用selectpoll 知道何时处理缓冲区。
  • 好吧,我需要在用户空间应用程序中读取缓冲区,才能像中断一样工作。我不想实现其他版本的轮询。目前我只是轮询设备以获取在缓冲区已满时设置的特定标志。也许这仍然可以使用 char 设备,尽管我对它们不太熟悉。
  • poll(2) 对于函数的作用来说并不是一个好名字——它实际上并不轮询,它等待一个事件(如select(2))。请参阅此处的 linux 设备驱动程序书:xml.com/ldd/chapter/book/ch05.html#t4

标签: linux signals driver pid pci-e


【解决方案1】:

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

我认为请参阅Linux Device Drivers 第 3 章。

【讨论】:

  • 也许我需要一个字符设备,但我仍然不确定它是否可以。设备周期性地向驱动程序发送一个中断,驱动程序需要将该中断到达用户空间应用程序。数据始终可用,但用户空间应用程序应该只定期读取数据,以便有时间将其全部打印出来。当前,用户空间应用程序轮询等待在设备上切换的标志更改。似乎添加 char 设备是不必要的开销。为什么不应该使用信号?
  • 应用程序如何知道从哪里读取数据?如果在用户空间应用程序正在读取数据缓冲区时发生中断会发生什么?如果您使用 char 设备等既定设计,所有这些细节都会得到照顾。在中断处理程序中有很多关于你能做什么和不能做什么的规则。你准备好应对这些了吗?
  • 应用程序读取和写入设备上的直接内存位置。如果使用 char 设备,这仍然会发生。通过在特定寄存器中设置一个位来在设备上生成中断,这会导致驱动程序上的中断处理程序运行。中断处理程序将不会再次运行,直到该位被清除并再次设置。设备不会清除该位,必须由驱动程序或应用程序来完成。发送多个标准信号(kill)只会让一个被排队。我已经在驱动程序中使用了中断处理程序,因此目前正在处理这些规则
  • 如果您打算使用信号,那么您需要一种方法让您的应用程序与您的驱动程序对话。这通常是通过 char 设备完成的。您可以使用 ioctl 将应用程序的 pid 传递给驱动程序。不确定如何找到 task_struct。也许 [stackoverflow.com/questions/8547332/…
  • 嗯信号看起来很简单。在我使用的 linux 版本中,信号的支持方式似乎并不简单。我想 char 驱动程序是要走的路,但我不知道该怎么办。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-12
      • 1970-01-01
      • 2018-04-18
      • 1970-01-01
      • 2021-12-19
      • 1970-01-01
      • 2011-01-17
      • 1970-01-01
      相关资源
      最近更新 更多