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 回答