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



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

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

使用ioctl可以解决这个问题,但由于该命令并不是控制设备,而是收集一些统计信息,因此不确定它是否是一个适合Linux使用的好机制。我们目前使用的是3.4内核;不确定Netlink在这个版本中是否有损耗(以前的版本我遇到过一些问题,比如当队列变满时,套接字开始丢弃数据)。mmap是另一种选择。有人能告诉我使用的最佳界面是什么吗

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

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

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

您可以执行ioctl IO调用(而不是IOR、IOW或IORW)。Ioctl对于收集信息非常有用。通过这种方式,您将有很大的灵活性,因为您可以传递不同大小的缓冲区或结构来填充数据。

最新更新