【发布时间】:2015-04-16 11:27:45
【问题描述】:
首先,我是一名设备驱动专家。这是我第一次处理用户模式程序。 我曾经有一个中断服务程序来响应硬件中断。 换句话说,硬件使用中断服务程序来通知驱动程序进行服务。 我现在使用 ioctl 作为应用程序和设备驱动程序之间通信的通道并轮询它以等待响应。 设备驱动程序在完成某些任务时是否可以通过其他方式通知应用程序? 欢迎任何cmets。 谢谢,
【问题讨论】:
标签: c linux-kernel
首先,我是一名设备驱动专家。这是我第一次处理用户模式程序。 我曾经有一个中断服务程序来响应硬件中断。 换句话说,硬件使用中断服务程序来通知驱动程序进行服务。 我现在使用 ioctl 作为应用程序和设备驱动程序之间通信的通道并轮询它以等待响应。 设备驱动程序在完成某些任务时是否可以通过其他方式通知应用程序? 欢迎任何cmets。 谢谢,
【问题讨论】:
标签: c linux-kernel
有几种机制可以做到这一点。第一种方法:用户空间应用程序进行poll() 或select() 系统调用,等待来自内核的一些事件。第二种方法是使用Netlink sockets。还有其他类似mmap() 或信号。通过kernel user-space IPC 谷歌,您将看到整个列表。
至于您的情况(驱动程序开发),我会说采用下一种方法。在您的驱动程序中创建 sysfs 文件,然后执行sysfs_notify()(可能还有wait_for_completion_interruptible_timeout() 或类似的东西)。在用户空间中为您的驱动程序 sysfs 文件执行 select() 系统调用。以line discipline installed from user-space 为例。
【讨论】:
通常,内核从不通知应用程序,除非应用程序请求通知并等待通知。在 unix 系统上,这通常使用select 或类似的例程来完成。一个为 select 提供一组文件描述符,然后 select 将等待直到其中一个文件描述符上有活动,然后它返回。
鉴于在 unix 上所有设备都是文件,您应该能够利用这种机制在某些硬件设备上出现中断时唤醒应用程序。
【讨论】:
除了 ioctl(信号、套接字等)之外,还有很多内核-用户空间通信接口。详细解释请参考Kernel Space - User Space Interfaces教程。
【讨论】: