2013-03-19 2 views
5

В настоящее время я работаю с модулем ядра Linux, и мне нужно получить доступ к некоторым 64-разрядным значениям, хранящимся в массиве, однако мне сначала нужно наложить их из указателя void.Вставить указатель void в uint64_t массив в C

Я использую функцию ядра phys_to_virt, которая возвращает указатель на пустоту, и я не совсем уверен, как на самом деле использовать этот указатель void для доступа к элементам в массиве, на который он указывает.

В настоящее время я делаю это:

void *ptr; 
uint64_t test; 

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

Значение я получаю от теста не то, что я ожидал увидеть в массиве, так что я достаточно уверен, что я делаю что-то неправильно , Мне нужно получить доступ к первым трем элементам в массиве, поэтому мне нужно указать указатель void на uint64_t [], но я не совсем уверен, как это сделать.

Любые советы были бы весьма полезными.

Благодаря

+1

Сам код кажется действительным, но отображение физической памяти в виртуальную не является допустимой операцией во всех случаях. Что именно указывает ваш 'physAddr'? – SomeWittyUsername

+0

Он должен указывать на массив из 512 элементов, содержащий 64-битные значения. – Tony

+0

Но что это за массив? Является ли он в общей памяти внутри внешнего устройства? – SomeWittyUsername

ответ

3

Я использую ядро ​​функции phys_to_virt, которая возвращает указатель недействительным, и я не совсем уверен, как на самом деле использовать этот указатель недействительным для доступа к элементам в массиве, что указывает на ,

Yup, phys_to_virt() действительно возвращает void *. Концепция void * заключается в том, что она является безликой, поэтому вы можете хранить что-нибудь в ней, и да, вам нужно придумать ее для чего-то, чтобы извлечь из нее информацию.

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. 

Так что да, test = *(uint64_t*)ptr; правильно типаж и дать вам первый элемент массива. Обратите внимание, вы также можете написать это так:

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

Что вы могли бы найти немного яснее и означает то же самое.

+0

Большое спасибо Майку! Это предельно ясно и полезно. – Tony

 Смежные вопросы

  • Нет связанных вопросов^_^