【问题标题】:The address in Kernel内核中的地址
【发布时间】:2012-06-13 03:00:55
【问题描述】:

当我在内核中找到地址时,我有一个问题。我在内核中插入了一个hello模块,在这个模块中,我放了这些东西:

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

我想我可以得到mystring的物理地址,但是我发现,在syslog中,它的打印地址是0x38dd0000。但是,我把内存转储出来,发现它的真实地址是dcd2a000,这与前者有很大的不同。这要怎么解释?我做错事情了?谢谢

PS:我使用了一个工具来转储整个内存,物理地址。

【问题讨论】:

  • 当你“转储内存”时,你没有得到虚拟地址吗?
  • 我转储的内存是物理地址,我用了一个工具
  • 什么是硬件平台?

标签: c linux kernel kernel-module


【解决方案1】:

根据Man page of VIRT_TO_PHYS

返回的物理地址是给定内存地址的物理 (CPU) 映射。 此功能仅适用于直接通过kmalloc映射或分配的地址。

此函数不提供 DMA 传输的总线映射。在几乎所有可以想象的情况下,设备驱动程序都不应该使用这个函数

尝试先使用kmallocmystring 分配内存;

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

【讨论】:

  • 我这样用但是有错误,首先是kmalloc应该有两个参数,所以我添加了GEL_KERNEL,第二个是在strcpy行,我认为strcpy不被接受......所以如何可以解决吗,谢谢
  • 哈哈,哇!抱歉,我接触内核已经大约 6 个月了。就 strcpy 而言,如果您的内核源提供了一个,您应该能够#include &lt;string.h&gt;。或者你可以自己写。
  • 非常感谢!但是当我做的时候,也有两个错误,一个是char *mystring = kmalloc(19, GFP_KERNEL); 错误是initializer element is not constant,另一个是strcpy(mystring, "this is my address"); 命令,错误是expected ')' before string constant 我已经在这里添加了你写的strcpy函数,谢谢!!
猜你喜欢
  • 2012-02-01
  • 1970-01-01
  • 2011-06-30
  • 2018-02-23
  • 1970-01-01
  • 2015-10-02
  • 2014-11-13
  • 2013-03-10
  • 1970-01-01
相关资源
最近更新 更多