提问人:Mehmet Fide 提问时间:11/15/2023 最后编辑:Mehmet Fide 更新时间:11/15/2023 访问量:32
Linux netlink 套接字行为,同时将数据从内核推送到用户空间
Linux netlink socket behaviours while pushing data from kernel to user space
问:
我在内核中接收了 20MB/秒的数据,这些数据通过 PCIe/DMA 从外部设备流式传输,块为 1MB,我需要将内核中的这些数据推送到应用程序。(Linux 内核 v5.4,64 位)
根据这里的讨论,我有几个选择,但我现在正在评估用于此目的。我已经研究了这本书/第 2 章以及几个 stackoverflow 问题,但在开始实际实现之前,我找不到有关 netlink 问题的答案。netlink socket
在上面的源代码中提到它有一个内部,因此应用程序不必在严格的狭窄时间内处理从内核推送的所有数据,这完全符合我的意图。netlink
FIFO
但没有人提到:
我想分配 128MB FIFO,以便应用程序在溢出之前应该有 ~6 秒的时间来处理队列中的数据。netlink API 中没有提供用于指定 FIFO 大小的接口,那么它真的有内部 FIFO 吗?如果是,那么它的大小是多少以及如何在内核模块中增加/减少?
我打算在 MSI 中断中使用函数将数据从内核推送到应用程序,这表明 1MB 数据块已准备好推送。但这个函数应该是非阻塞的。这个功能真的吗?
nlmsg_put()
non-blocking
如果内部FIFO已满,功能的行为是什么?
nlmsg_put()
在内核模块的头文件中,将使用 函数将变量定义为 .这是否意味着,我可以一次将通过 DMA 收到的 1MB 块推送到应用程序吗?
linux/netlink.h
struct nlmsghdr
nlmsg_put()
nlmsg_len
u32
当数据从内核推送到应用程序时,netlink 是否遵循零拷贝方法?
答: 暂无答案
评论
mmap
ioctl