2013-03-19 29 views
5

Obecnie pracuję z modułem jądra Linux i potrzebuję uzyskać dostęp do niektórych 64-bitowych wartości przechowywanych w tablicy, jednak najpierw muszę rzucić z pustego wskaźnika.Przesyłaj pustą tablicę do tablicy uint64_t w C

Korzystam z funkcji jądra phys_to_virt, która zwraca wskaźnik pustej przestrzeni, i nie jestem do końca pewien, jak właściwie użyć tego pustego wskaźnika, aby uzyskać dostęp do elementów w tablicy, do której on wskazuje.

Obecnie robię tak:

void *ptr; 
uint64_t test; 

ptr = phys_to_virt(physAddr); 
test = *(uint64_t*)ptr; 
printk("Test: %llx\n", test); 

Wartość Dostaję z testu nie jest to, co spodziewałem się zobaczyć w tablicy, więc jestem pewny, że robię coś złego . Potrzebuję dostępu do pierwszych trzech elementów w tablicy, więc muszę rzucić wskaźnik pustego miejsca na uint64_t [], ale nie jestem do końca pewien, jak to zrobić.

Każda rada byłaby mile widziana.

Dzięki

+1

Sam kod wydaje się poprawny, ale odwzorowanie pamięci fizycznej na wirtualną nie jest prawidłową operacją we wszystkich przypadkach. Co dokładnie wskazuje twój "physAddr"? – SomeWittyUsername

+0

Powinien wskazywać na tablicę elementów 512 zawierającą 64-bitowe wartości długie. – Tony

+0

Ale czym jest ta tablica? Czy jest w pamięci współdzielonej w urządzeniu zewnętrznym? – SomeWittyUsername

Odpowiedz

3

Używam jądra funkcji phys_to_virt który powraca wskaźnik void, a ja nie jestem do końca pewien, jak właściwie korzystać z tej void wskaźnik dostępu do elementów w tablicy, która wskazuje na to .

Yup, phys_to_virt() rzeczywiście zwraca wartość void *. Koncepcja void * polega na tym, że jest bezlistna, więc możesz przechowywać do niej cokolwiek, i tak, musisz wpisać ją w coś, aby wyodrębnić z niej informacje.

ptr = phys_to_virt(physAddr); // void * returned and saved to a void *, that's fine 

test = *(uint64_t*)ptr; // so: (uint64_t*)ptr is a typecast saying "ptr is now a 
         //  uint64_t pointer", no issues there 
         // adding the "*" to the front deferences the pointer, and 
         // deferencing a pointer (decayed from an array) gives you the 
         // first element of it. 

Więc tak, test = *(uint64_t*)ptr; będzie poprawnie typecast i daje pierwszy element tablicy. Zauważ, że możesz również napisać to tak:

test = ((uint64_t *)ptr)[0]; 

Które mogą być nieco bardziej wyraźne i oznacza to samo.

+0

Wielkie dzięki Mike! To niezwykle jasne i pomocne. – Tony