【问题标题】:Sending a struct from kernel to userland via netlink通过 netlink 将结构从内核发送到用户空间
【发布时间】:2013-09-27 11:43:19
【问题描述】:

我正在尝试根据以下答案将结构从 LKM 发送到用户区:Netlink Sockets in C using the 3.X linux kernel

答案本身的代码是完全可编译的,但是当我尝试发送 struct 而不是 char * 时,我在用户空间中遇到了段错误。

这是我改变的:

netlinkKernel.c

我补充:

typedef struct test{
    int a;
    char *b;
} s_test;

替换

char *msg = "Hello from kernel";

---

msg_size = strlen(msg);

---

strncpy(nlmsg_data(nlh),msg,msg_size);

s_test x;
x.a = 42;
x.b = "The answer";

---

msg_size(sizeof(x));

---

memcpy(nlmsg_data(nlh), &x, msg_size);

netlinkUser.c

我添加相同的结构并替换

printf("Received message payload: %s\n", (char *)NLMSG_DATA(nlh));

s_test *x = (s_test *)NLMSG_DATA(nlh);
printf("Received message payload: %d - %s\n", x->a, x->b);

问题出在哪里?

【问题讨论】:

    标签: c linux kernel kernel-module netlink


    【解决方案1】:

    这是您的问题:您的结构包含指向内核空间中其他内存的指针 (char *b)。但是,您发送到用户空间的只是结构中的指针,而不是其他内存位 ("The answer")。此外,即使您还要发送额外的内存,b 仍然是指向 内核 虚拟地址的指针。

    最好的办法是让 b 成为一个 char 数组并将数据复制到 b 中。

    在进程之间或进程与内核之间发送的数据内部的指针通常是非常有问题的。使用指针结构的系统调用,例如。 G。 man 2 recvmsg,不要只是在用户空间和内核之间逐字发送指针,而是内核会单独访问用户空间来解析每个指针。

    【讨论】:

    • 这是有道理的,但是为什么我链接到的答案中的演示有效?该演示发送char *,而不是char [N]
    • 另外,这只是一个 POC,我真正的结构有一个 5 char* 和一个 pid_t,也许我会添加更多。我想我需要一个反序列化库。你知道吗(可以在内核方面工作,也就是没有 malloc/free 但 kmalloc/kfree 等等......)?
    猜你喜欢
    • 2011-03-02
    • 1970-01-01
    • 2014-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-13
    • 1970-01-01
    相关资源
    最近更新 更多