【问题标题】:kernel-space user-space communication with netlink使用 netlink 的内核空间用户空间通信
【发布时间】:2010-12-14 15:11:43
【问题描述】:

我的目标是始终在内核内存中拥有一个数组或列表,以便始终可以从内核空间访问它。为此,我使用这里推荐的 netlink 套接字。我关注this example,它显示了如何发送字符串。我不确定如何在套接字中发送结构数组或结构列表。

typedef struct {
    int fiveDollarBills;
    int denDollarBills;
} Bills;

是否可以使用 netlink 发送列表或数组?

【问题讨论】:

  • 如果一切都失败了,你可以序列化你的数据并发送字符串
  • 嗯……没想到。 C是否支持序列化?另外,如果我发送字符串,是否可以在内核空间中使用 string.h lib 来进行字符串比较?
  • 我不认为,您需要任何特殊的序列化支持,您只需复制结构的内容即可。 netlink socket 的两端总是运行在同一个系统上,所以二进制布局或多或少是无关紧要的。
  • @lunaryorn: 除非内核是 64 位,用户空间是 32 位。
  • @ephemient:当然,我当然没有想到这一点。但我认为,我们可以同意,使用内核本身以外的其他架构构建内核工具是一个相当愚蠢的想法。

标签: c kernel netlink


【解决方案1】:

NetLink 本身并不关心数据是字符串、整数、结构等。它只需要一个 void* 和一个长度,然后复制数据而不查看它。您可以将结构转换为 void* 并使用 sizeof 来确定长度并通过 netlink 发送该数据。

另一方面,您只需要获取 void* 和长度,验证长度是否为应有的长度,然后将 void* 转换回指向您的结构的指针。需要验证的两个重要事项是:

  1. UserSpace 和 KernelSpace 代码都同意结构的内存布局。这意味着针对相同的 .h 进行编译,并确保编译选项使得内存布局和对齐方式相同。

  2. Struct 将作为原始内存副本传输,没有修复指针的智能,因此您的结构不能包含任何指针等。

另一种选择不是发送原始数据,而是通过将数据从已知格式的字符串转换为自己“序列化”数据。这将允许您以额外的 CPU 和内存开销为代价来处理更复杂的数据结构

【讨论】:

    猜你喜欢
    • 2011-03-02
    • 1970-01-01
    • 2012-07-15
    • 2014-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-27
    相关资源
    最近更新 更多