2013-03-19 7 views
5

ich bin zur Zeit mit einer Linux-Kernel-Modul arbeitet, und ich brauche einige 64-Bit-Werte in einem Array gespeichert zuzugreifen, aber ich zuerst von einem Hohlraum gegossen Zeigern muß.Gusshohlraum Zeiger auf uint64_t Array in C

Ich benutze die Kernel-Funktion phys_to_virt, die einen void-Zeiger zurückgibt, und ich bin nicht ganz sicher, wie dieser void-Zeiger tatsächlich verwendet wird, um auf Elemente innerhalb des Arrays zuzugreifen, auf das er zeigt.

Derzeit mache ich das:

void *ptr; 
uint64_t test; 

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

Der Wert Ich bin von Test immer noch nicht, was ich innerhalb des Arrays zu sehen erwartet, also bin ich ziemlich sicher, dass ich etwas falsch mache . Ich muss auf die ersten drei Elemente im Array zugreifen, also muss ich den void-Zeiger auf einen uint64_t [] umwandeln, aber ich bin nicht ganz sicher, wie ich das machen soll.

Jeder Rat würde sehr geschätzt werden.

Dank

+1

Der Code selbst gültig, aber die Abbildung physischen Speicher virtuellen scheint keine gültige Operation in allen Fällen. Worauf genau deutet dein 'physAddr' hin? – SomeWittyUsername

+0

Es sollte auf ein Array mit 512 Elementen verweisen, das 64-Bit-Werte enthält. – Tony

+0

Aber was ist das Array? Befindet es sich im Shared Memory innerhalb eines externen Geräts? – SomeWittyUsername

Antwort

3

Ich bin mit der Kernfunktion phys_to_virt, die einen void-Zeiger zurückgibt, und ich bin nicht ganz sicher, wie eigentlich diese Lücke Zeiger verwenden Elemente innerhalb des Arrays zuzugreifen dass es auf .

Yup, phys_to_virt() gibt tatsächlich eine void * zurück. Das Konzept der void * ist, dass es ohne Typen, so dass Sie alles, um es zu speichern, und ja müssen Sie es etwas typisieren Informationen daraus zu extrahieren.

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. 

Also ja, test = *(uint64_t*)ptr; werden Sie das erste Element des Arrays korrekt typisieren und geben. Beachten Sie, dass Sie es auch so schreiben können:

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

Welche Sie vielleicht ein wenig klarer finden und bedeutet das gleiche.

+0

Vielen Dank Mike! Die extrem klar und hilfreich ist. – Tony