linux - ioctl vs netlink vs memmap 在内核空间和用户空间之间进行通信

标签 linux linux-device-driver

每当用户要求在 Linux 用户空间中使用命令时,都会显示我们自定义硬件的一些统计信息。此实现目前使用 PROC 接口(interface)。我们开始添加更多统计信息,然后我们遇到了一个问题,其中特定的统计命令必须执行两次才能获取整个数据,因为 PROC 界面被限制在 1 页。

如上所述,内核和用户空间之间的数据传输并不重要,但根据数据,用户可能会做出一些决定。我们对这个接口(interface)设计的要求是它应该能够传输可能大于 8192 字节的数据量并且该命令需要使用最少的内核资源(如锁等)并且它需要快速。

使用 ioctl 可以解决这个问题,但由于该命令完全不是控制设备而是收集一些统计信息,不确定它是否是按照 Linux 使用的好机制。我们目前使用的是3.4内核;不确定 Netlink 在这个版本中是否有损(以前的版本我遇到过队列变满时,套接字开始丢弃数据等问题)。 mmap 是另一种选择。任何人都可以建议我使用什么是最好的界面

最佳答案

  • 内核服务可以通过 Netlink 将信息直接发送到用户应用程序,而您必须使用 ioctl 函数显式轮询内核,这是一种相对昂贵的操作。
  • Netlink 通信是非常异步的,每一方都会在另一方发送消息后的某个时刻接收消息。 ioctl 是完全同步的:“嘿内核,醒来!我需要你现在处理我的请求!切切切!”
  • Netlink 支持内核和多个用户空间进程之间的多播通信,而 ioctl 是严格一对一的。

  • Netlink 消息可能会因各种原因(例如内存不足)而丢失,而 ioctls 由于其即时处理性质通常更可靠。

因此,如果您从用户空间(应用程序)向内核请求统计信息,则使用 IOCTL 更加可靠且易于使用,而如果您在内核空间中生成统计信息,并且您希望内核空间将这些数据发送到用户空间(应用程序)你必须使用 Netlink 套接字。

关于linux - ioctl vs netlink vs memmap 在内核空间和用户空间之间进行通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11501527/

相关文章:

linux - ff_effect 中的 ff_replay 子结构为空

linux - 如何使用 LTIB 交叉编译 C++ 文件

python比较两个日期

networking - 以太网驱动程序 - 不使用 DMA?

linux - 从 sleep_on() 到 wait_event()?

通过 ALSA 捕捉声音

c - device_create 使用现有设备名称

linux - 意外标记附近的语法错误 'GTK'

linux - FTDI D2XX 库适用于 Ubuntu,但在 ezsdk 交叉编译上显示错误

linux:灵活的缓冲命令?