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

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

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

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


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


  • 内核服务可以通过Netlink直接向用户应用程序发送信息,而您可以使用ioctl函数显式轮询内核,这是一项相对昂贵的操作。
  • Netlink通讯是非常异步的,每一方都会在对方发送消息后的某个时间点接收消息。 ioctls纯粹是同步的:“嘿核心,唤醒! 我需要你现在处理我的请求! 劈斩!”
  • Netlink支持内核和多个用户空间进程之间的多播通信,而ioctl严格地是一对一的。

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

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

    链接地址: http://www.djcxy.com/p/80031.html

    上一篇: ioctl vs netlink vs memmap to communicate between kernel space and user space

    下一篇: ExtJS store add calls both create and destroy