2013-03-19 9 views
5

の配列をuint64_tをするためのvoidポインタをキャストします。は、私は現在、Linuxカーネルモジュールで働いていると私は、配列に格納されたいくつかの64ビット値にアクセスする必要がある、しかし私は最初のボイドポインタからキャストする必要がC

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つの要素にアクセスする必要があるので、私はuint64_tを[]にボイドポインタをキャストする必要がありますが、私はそれを行う方法はかなりわかりません。

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

おかげ

+1

コード自体は有効なようだが、仮想への物理メモリをマッピングすることはすべての場合に有効な操作ではありません。あなたの 'physAddr'が指しているものは何ですか? – SomeWittyUsername

+0

これは64ビット長の値を含む512素子アレイを指すべきです。 – Tony

+0

しかし、この配列は何ですか?それは外部デバイス内の共有メモリにありますか? – SomeWittyUsername

答えて

3

私がvoidポインタを返すカーネル関数phys_to_virtを使用している、と私は実際にそれが指すこと、配列内の要素にアクセスするには、このボイドポインタを使用する方法が全くわからないんだけど。

はい、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;は正しく型キャストとあなたの配列の最初の要素を提供します。また、次のように書くこともできます:

これは少し鮮明で、同じことを意味するかもしれません。

+0

ありがとうMike! これは非常に明確で有用です。 – Tony

関連する問題

 関連する問題