7

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

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

mystringの物理アドレスを取得できると思いますが、syslogで、出力されたアドレスは0x38dd0000です。しかし、メモリをダンプして、実際のアドレスがdcd2a000であることがわかりました。これは、前のアドレスとはかなり異なります。これをどのように説明しますか?私は何か悪いことをした?ありがとう

PS:私はツールを使用して、メモリ全体、物理アドレスをダンプしました。

4

1 に答える 1

7

VIRT_TO_PHYS のマニュアルページによると

返される物理アドレスは、指定されたメモリ アドレスの物理 (CPU) マッピングです。kmalloc を介して直接マップまたは割り当てられたアドレスに対してのみ、この関数を使用することが有効です。

この関数は、DMA 転送のバス マッピングを提供しません。ほとんどの場合、デバイス ドライバはこの関数を使用すべきではありません。

最初にmystring使用するメモリを割り当ててみてください。kmalloc

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);

ここにある strcpy の実装を次に示します

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

    while ((*dest++ = *src++) != '\0')
            /* nothing */;
    return tmp;
}
于 2012-06-12T02:33:56.697 に答える