9

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

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

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

4

2 回答 2

3
  • Kernel services can send information directly to user applications over Netlink, while you’d have explicitly poll the kernel with ioctl functions, a relatively expensive operation.
  • Netlink comms is very much asynchronous, with each side receiving messages at some point after the other side sends them. ioctls are purely synchronous: “Hey kernel, WAKE UP! I need you to process my request NOW! CHOP CHOP!”</li>
  • Netlink supports multicast communications between the kernel and multiple user-space processes, while ioctls are strictly one-to-one.

  • Netlink messages can be lost for various reasons (e.g. out of memory), while ioctls are generally more reliable due to their immediate-processing nature.

So If you asking for statistics to kernel from user space(application) it is more reliable and easy to use IOCTL while if you generate statistics in kernel space and you want your kernel space to send those data to user space(application) you have to use Netlink sockets.

于 2018-04-13T19:28:28.120 回答
1

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

于 2012-09-14T19:12:41.987 回答