每当用户要求在 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/