Linux netlink 套接字行为,同时将数据从内核推送到用户空间

Linux netlink socket behaviours while pushing data from kernel to user space

提问人:Mehmet Fide 提问时间:11/15/2023 最后编辑:Mehmet Fide 更新时间:11/15/2023 访问量:32

问:

我在内核中接收了 20MB/秒的数据,这些数据通过 PCIe/DMA 从外部设备流式传输,块为 1MB,我需要将内核中的这些数据推送到应用程序。(Linux 内核 v5.4,64 位)

根据这里的讨论,我有几个选择,但我现在正在评估用于此目的。我已经研究了这本书/第 2 章以及几个 stackoverflow 问题,但在开始实际实现之前,我找不到有关 netlink 问题的答案。netlink socket

在上面的源代码中提到它有一个内部,因此应用程序不必在严格的狭窄时间内处理从内核推送的所有数据,这完全符合我的意图。netlinkFIFO

但没有人提到:

  1. 我想分配 128MB FIFO,以便应用程序在溢出之前应该有 ~6 秒的时间来处理队列中的数据。netlink API 中没有提供用于指定 FIFO 大小的接口,那么它真的有内部 FIFO 吗?如果是,那么它的大小是多少以及如何在内核模块中增加/减少?

  2. 我打算在 MSI 中断中使用函数将数据从内核推送到应用程序,这表明 1MB 数据块已准备好推送。但这个函数应该是非阻塞的。这个功能真的吗?nlmsg_put()non-blocking

  3. 如果内部FIFO已满,功能的行为是什么?nlmsg_put()

  4. 在内核模块的头文件中,将使用 函数将变量定义为 .这是否意味着,我可以一次将通过 DMA 收到的 1MB 块推送到应用程序吗?linux/netlink.hstruct nlmsghdrnlmsg_put()nlmsg_lenu32

  5. 当数据从内核推送到应用程序时,netlink 是否遵循零拷贝方法?

linux-kernel linux-device-driver netlink

评论

1赞 Marco Bonelli 11/16/2023
我不会浪费太多时间在具有相当复杂界面的 netlink 套接字上(因为您可能已经可以从所有问题中猜到)。创建一个简单的杂项设备,实现环形缓冲区并允许读取和写入。或者更好的是,允许将环形缓冲区直接发送到用户空间,以避免浪费时间复制数据,并允许通过 控制头/尾指针。mmapioctl

答: 暂无答案