5
我試圖從LKM到用戶空間的基礎上,這個答案發送一個struct用戶態:Netlink Sockets in C using the 3.X linux kernel發送從內核結構通過網絡鏈路
從答案本身的代碼是完全編譯,但是當我嘗試發送一個struct
而不是一個char *
,我得到了用戶級的segfaults。
這是我改變:
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 *''',而不是'''char [N]'''。 – alexandernst
此外,這只是一個POC,我真正的結構有5個字符*和一個pid_t,也許我會添加更多。我想我需要一個de /序列化庫。你知道任何(這將在內核方面,也就是說,沒有malloc/free但是kmalloc/kfree等等)? – alexandernst