2012-06-09 8 views
7

私はカーネル内のアドレスを見つけたときに質問があります。私は、このモジュールでは、私はこれらの事入れ、カーネルにハローモジュールを挿入します。カーネル内のアドレス

char mystring[]="this is my address"; 
printk("<1>The address of mystring is %p",virt_to_phys(mystring)); 

は私が列MyStringの物理アドレスを取得することができると思いますが、私が見つけたものを、syslogに、その印刷されたアドレスです0x38dd0000。しかし、私はメモリをダンプし、その実際のアドレスがdcd2a000であることを発見しました。これは前者とはかなり異なります。これを説明する方法は?私は何か悪いことをした?ありがとう

PS:メモリ全体の物理アドレスをダンプするツールを使用しました。

+0

あなたが「メモリをダンプ」するときは、そこに仮想アドレスを取得できませんでしたか? –

+0

私はダンプされたメモリは物理的なアドレスです、私はツールを使用しました – Alex

+2

ハードウェアプラットフォームは何ですか? – shodanex

答えて

7

Man page of VIRT_TO_PHYS

によれば返さ物理アドレスが所定のメモリアドレスの物理的(CPU)のマッピングです。 この機能は、kmalloc経由で直接マップされたアドレスに対してのみ有効です。

この関数は、DMA転送のバスマッピングを提供しません。ほとんどすべての考えられる場合にはデバイスドライバがこの機能を使用すべきではない

最初kmallocを用いmystringするためのメモリを割り当ててみてください。ここで

char *mystring = kmalloc(19, GFP_KERNEL); 
strcpy(mystring, "this is my address"); //use kernel implementation of strcpy 
printk("<1>The address of mystring is %p", virt_to_phys(mystring)); 
kfree(mystring); 

hereを発見したのstrcpyの実装です:

char *strcpy(char *dest, const char *src) 
{ 
    char *tmp = dest; 

    while ((*dest++ = *src++) != '\0') 
      /* nothing */; 
    return tmp; 
} 
+0

私はこのように使用しましたが、エラーがあります。まずkmallocに2つの引数が必要です。GEL_KERNELを追加しました.2番目はstrcpy行にあります。私は 'strcpy'が受け入れられないと思います...どうして解決できますか? – Alex

+1

ハハ、woops!申し訳ありませんが、カーネルに触れてから約6ヶ月です。 strcpyが実行される限り、あなたのカーネルソースが提供するものなら '#include 'になるはずです。あるいは自分で書くこともできます。 – Anthony

+0

ありがとう!たくさん!しかし、私がそれを作るとき、2つのエラーもあります。一つは 'char * mystring = kmalloc(19、GFP_KERNEL);'エラーは '初期化子要素が定数でない'、 'strcpy(mystring、これは私のアドレスです。 'command、エラーは' expected 'です)' before string constant'私はstrcpy関数を既に追加しました。ありがとう!! – Alex

関連する問題