2013-09-22 15 views
5

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?

Odpowiedz

4

Oto twój problem: twoja struktura zawiera wskaźnik do innej pamięci w przestrzeni jądra (char *b). Jednak to, co wysyłasz do przestrzeni użytkownika, to tylko wskaźnik w strukturze, a nie ten inny bit pamięci ("The answer"). Ponadto, nawet jeśli wyślesz również dodatkową pamięć, to nadal jest to wskaźnik do adresów wirtualnych kernela.

Najlepiej jest zrobić b a char array i skopiować dane na b.

Wskaźniki wewnątrz danych przesyłane między procesami lub między procesem a jądrem są generalnie bardzo problematyczne. wywołania systemowe wykorzystujące struktury wskaźników, np. sol. man 2 recvmsg, nie wysyłaj dosłownych słów między przestrzenią użytkownika i jądrem, zamiast tego jądro ma oddzielny dostęp do przestrzeni użytkownika, aby rozwiązać każdy wskaźnik.

+0

Ma to sens, ale dlaczego działa wersja demo z odpowiedzi, którą łączę? Demo wysyła '' 'char *' '', a nie '' char [N] '' '. – alexandernst

+0

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

Powiązane problemy