加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

通过netlink将结构从内核发送到userland

发布时间:2020-12-13 18:56:52 所属栏目:Linux 来源:网络整理
导读:我试图根据这个答案将LKM中的结构发送到用户区:Netlink Sockets in C using the 3.X linux kernel 答案本身的代码是完全可编译的,但是当我尝试发送结构而不是char *时,我会在userland中获得段错误. 这是我改变的: netlinkKernel.c 我加: typedef struct t

我试图根据这个答案将LKM中的结构发送到用户区:Netlink Sockets in C using the 3.X linux kernel

答案本身的代码是完全可编译的,但是当我尝试发送结构而不是char *时,我会在userland中获得段错误.

这是我改变的:

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: %sn",(char *)NLMSG_DATA(nlh));

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

问题出在哪儿?

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

你最好的办法是使b成为char数组并将数据复制到b中.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读