gpt4 book ai didi

c - 通过 netlink 将结构从内核发送到用户空间

转载 作者:IT王子 更新时间:2023-10-29 00:32:37 27 4
gpt4 key购买 nike

我正在尝试根据以下答案将结构从 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);

问题出在哪里?

最佳答案

这是您的问题:您的结构包含指向内核空间中其他内存的指针 (char *b)。但是,您发送到用户空间的只是结构中的指针,而不是内存的其他部分(“答案”)。此外,即使您也发送额外的内存,b 仍然是指向内核 虚拟地址的指针。

最好的办法是将 b 设为一个字符数组并将数据复制到 b 中。

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

关于c - 通过 netlink 将结构从内核发送到用户空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18944665/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com