5

現在、Linuxカーネルモジュールを使用しており、配列に格納されている64ビット値にアクセスする必要がありますが、最初にvoidポインターからキャストする必要があります。

voidポインターを返すカーネル関数phys_to_virtを使用していますが、このvoidポインターを実際に使用して、それが指す配列内の要素にアクセスする方法が完全にはわかりません。

現在、私はこれを行っています:

void *ptr;
uint64_t test;

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

テストから得た値は、配列内で期待したものではないため、何か間違ったことをしていると確信しています。配列の最初の3つの要素にアクセスする必要があるため、voidポインターをuint64_t []にキャストする必要がありますが、その方法がよくわかりません。

アドバイスをいただければ幸いです。

ありがとう

4

1 に答える 1

3

voidポインターを返すカーネル関数phys_to_virtを使用していますが、このvoidポインターを実際に使用して、それが指す配列内の要素にアクセスする方法が完全にはわかりません。

うん、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];

あなたはもう少し明確に感じるかもしれません、そして同じことを意味します。

于 2013-03-27T18:35:57.770 に答える