c - 使用 netlink 进行内核空间用户空间通信

标签 c kernel netlink

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

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

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

最佳答案

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

在另一端,您只需要获取 void* 和长度,验证长度是否符合预期,然后将 void* 转换回指向您的结构的指针。要验证的两个重要事项是:

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

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

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

关于c - 使用 netlink 进行内核空间用户空间通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4440584/

相关文章:

c++ - 如何在 C 中访问 SOAP header

c - 如何使用引用了内存中存储的inode创建虚拟文件

c - 在 XV6 中执行停止的进程

linux - libevent 是否支持 netlink socket

c - 通过 netlink 从内核向用户空间单播数据时失败

c - OpenSSL 和 Apple Keychain 集成

c - 减少c中的分数

c - 如何将用户空间进程切换回根网络命名空间?

c - 无符号字符困扰我的代码

linux - Netlink 套接字,libnl - - nl_recvmsgs_default 返回 -22