我试图根据这个答案将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: %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成为char数组并将数据复制到b中.
在进程之间或进程与内核之间发送的数据内的指针通常是非常有问题的.使用指针结构的系统调用,例如: G. man 2 recvmsg,不要只是在用户空间和内核之间逐字发送指针,而是内核确实单独访问用户空间来解析每个指针.
总结以上是内存溢出为你收集整理的通过netlink将结构从内核发送到userland全部内容,希望文章能够帮你解决通过netlink将结构从内核发送到userland所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)