2013-03-19 12 views
5

Şu anda bir Linux çekirdek modülüyle çalışıyorum ve bir dizide saklanan bazı 64 bitlik değerlere erişmem gerekiyor, ancak önce bir boşluk işaretçisini kullanmam gerekiyor.C: 'de uint64_t dizisi için void işaretçiyi göster

Boş bir işaretçi döndüren çekirdek işlevi phys_to_virt kullanıyorum ve bu işaretçiyi işaret ettikleri dizinin içindeki öğelere erişmek için gerçekten nasıl kullanılacağını tam olarak bilmiyorum.

Şu anda yapıyorum:

void *ptr; 
uint64_t test; 

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

ben testinden alıyorum değer ben diziye içinde görmeyi beklediğim değil, bu yüzden ben yanlış bir şey yapıyorum oldukça eminim . Dizideki ilk üç öğeye erişmem gerekiyor, bu yüzden void imlecini bir uint64_t [] 'e çevirmem gerekiyor, ancak bunun nasıl yapılacağından emin değilim.

Her türlü öneri çok takdir edilecektir.

Teşekkür

+1

Kodun kendisi geçerli gibi görünüyor ancak fiziksel belleği sanal olarak eşleştirmek, her durumda geçerli bir işlem değildir. 'PhysAddr'nızın tam olarak neyi işaret ediyor? – SomeWittyUsername

+0

64 bit uzun değerler içeren 512 öğe dizisini işaret etmelidir. – Tony

+0

Ama bu dizi nedir? Harici cihazda paylaşılan hafızada mı? – SomeWittyUsername

cevap

3

Bir boşluk işaretçi dönen çekirdek fonksiyonu phys_to_virt kullanıyorum ve ben aslında işaret eden dizinin içindeki elemanları erişmek için bu boşluk işaretçisi nasıl kullanılacağını tamamen emin değilim .

Evet, phys_to_virt() gerçekten void * çıkmıyor. void * kavramı, bu tür bir şey yok, bu yüzden herhangi bir şey saklayabilirsiniz, ve evet, ondan bilgi ayıklamak için bir şey onu typecast gerekir.

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. 

Yani evet, test = *(uint64_t*)ptr; doğru typecasting ve size dizinin ilk elemanını verecektir. Eğer biraz daha net bulup olabilir

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

aynı şeyi ifade: Ayrıca bu gibi yazabilirsiniz unutmayın.

+0

Çok teşekkürler Mike! Bu son derece açık ve yardımsever. – Tony

İlgili konular