当我在内核中找到地址时,我有一个问题。我在内核中插入一个 hello 模块,在这个模块中,我放置了这些东西:
char mystring[]="this is my address";
printk("<1>The address of mystring is %p",virt_to_phys(mystring));
我想我可以获得mystring的物理地址,但是我发现,在syslog中,它的打印地址是0x38dd0000。然而,我转储了内存,发现它的真实地址是dcd2a000,与之前的地址有很大不同。这怎么解释呢?我做错事情了?谢谢
PS:我使用了一个工具来转储整个内存、物理地址。
根据VIRT_TO_PHYS 的手册页 http://mirror.linux.org.au/linux.conf.au/2005/cdrom-beta-1/linux-mandocs-2.6.12.6/virt_to_phys.html
返回的物理地址是给定内存地址的物理(CPU)映射。仅在直接映射或通过 kmalloc 分配的地址上使用此函数才有效。
该函数不提供 DMA 传输的总线映射。在几乎所有可能的情况下,设备驱动程序不应使用此函数
尝试分配内存mystring
using kmalloc
first;
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 的实现here http://lxr.linux.no/linux/lib/string.c#L70:
char *strcpy(char *dest, const char *src)
{
char *tmp = dest;
while ((*dest++ = *src++) != '\0')
/* nothing */;
return tmp;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)