Próbuję wysłać struct z LKM do przestrzeni użytkownika, na podstawie tej odpowiedzi: Netlink Sockets in C using the 3.X linux kernelWysyłanie struct z jądra do przestrzeni użytkownika poprzez netlink
Kod z samego odpowiedź brzmi doskonale compilable, ale gdy próbuję aby wysłać struct
zamiast char *
, otrzymuję segfaults w przestrzeni użytkownika.
To jest to, co mogę zmienić:
netlinkKernel.c
dodam:
typedef struct test{
int a;
char *b;
} s_test;
i zastąpić
char *msg = "Hello from kernel";
---
msg_size = strlen(msg);
---
strncpy(nlmsg_data(nlh),msg,msg_size);
z
s_test x;
x.a = 42;
x.b = "The answer";
---
msg_size(sizeof(x));
---
memcpy(nlmsg_data(nlh), &x, msg_size);
netlinkUser.c
dodam taka sama struktura i zastąpić
printf("Received message payload: %s\n", (char *)NLMSG_DATA(nlh));
z
s_test *x = (s_test *)NLMSG_DATA(nlh);
printf("Received message payload: %d - %s\n", x->a, x->b);
Gdzie jest problem?
Ma to sens, ale dlaczego działa wersja demo z odpowiedzi, którą łączę? Demo wysyła '' 'char *' '', a nie '' char [N] '' '. – alexandernst
To był po prostu POC, moja prawdziwa struktura ma 5 znaków * i pid_t, a może dodam więcej. Myślę, że potrzebuję biblioteki de/serializacji. Czy znasz jakieś (które będzie działać po stronie jądra, aka, nie malloc/free ale kmalloc/kfree i tak dalej ...)? – alexandernst