2016-08-19 51 views
2

我正在使用x86体系结构。据我了解(并已告知),以获得分配的内存的物理地址,我需要做到以下几点:为什么物理地址值根据打印方式的不同而不同

struct SizeAddr { 
    size_t size; 
    u64 addr_uint64; 
    void* addr_voidp; 
    unsigned long addr_ul; 
}; 

struct SizeAddr sa; 

virtAddr = kmalloc(<some size>, GFP_KERNEL); 
physAddr = virt_to_phys(virtAddr); 

sa.addr_uint64 = (uint64_t)physAddr; 
sa.addr_voidp = (void *)physAddr; 
sa.addr_ul = (unsigned long)physAddr; 

我决定把打印出来的物理地址的值,所以我做到了以下内容:

printk(MODULE_NAME " virtAddr(%%p) = %p\n", virtAddr); 
    printk(MODULE_NAME " physAddr(%%pap) = %pap\n", &physAddr); 
    printk(MODULE_NAME " physAddr(%%llx) = %llx\n", sa.addr_uint64); 
    printk(MODULE_NAME " physAddr(%%p) = %p\n", sa.addr_voidp); 
    printk(MODULE_NAME " physAddr(%%lx) = %lx\n", sa.addr_ul); 

以下是我在日志中有:

[63898.990593] my_kmodule virtAddr(%p) = 0000000000000010 
[63898.990652] my_kmodule physAddr(%pap) = ffff88020d783eb0 
[63898.990711] my_kmodule physAddr(%llx) = 780000000010 
[63898.990768] my_kmodule physAddr(%p) = 0000780000000010 
[63898.990827] my_kmodule physAddr(%lx) = 780000000010 

而这正是我真的很困惑。不应该所有这些值都一样吗?为什么physAddr(%pap)与其余的值不同(虚拟地址除外,我明白这一点)。

+1

您没有显示指定'sa'的代码。 –

+4

'printk'#2是错误的。你想要'physAddr'和_not_'&physAddr'。另外,'phys_addr_t'可以是'u32'或'u64',所以转换为'u64'并尝试'%llx'。 –

+0

我不知道'pap'是什么,但打印指针值的方式是使用'printf(“%p”,(void *)virtAddr);' –

回答

-2

来自kmalloc的虚拟地址(virtAddr)的值为0x10是没有意义的。那么,在那之后,所有的赌注都没有了?

您确定您有phys_addr_t physAddr(与(例如)phys_addr_t *)?在我认为的堆栈上?

%pap的输出看起来像一个[stack]虚拟地址,而不是物理地址。所以,我的关于&physAddr/physAddr的评论可能会取决于您的完整代码。

printk("%p\n",&physAddr);是什么意思?或者,printk("%llx\n",(u64) &physAddr);?或者,其他组合(例如&virtAddr

尽管文档中说%pap没问题,但它也表示默认为phys_addr_t(即%pa)。无论应该工作[和我的printk代码似乎的检查,以确认这一点],只有大约5用法%pap和数以百计的%pa

用法我已经研究了printk源[复查,实际上,因为我之前不得不这么做]。目前,我没有发现任何差异。但是,消息来源有点复杂,所以我会继续这样做。


旁注:这是原来的职位编辑[一些澄清]之前[这是得到downvoted],但它仍然是一些尝试。

现在您已加入sa代码...

变化:

struct SizeAddr 

分为:

union SizeAddr 

添加phys_addr_t成员,只能设置[与工会] 。这是更常见的成语。然后,你会看到哪些被截断,哪些不被截断。否则,对于struct %llx,您会得到与%pap匹配的结果。

+0

我为什么要这么做?那只会将所有内容存储在一个位置。 – flashburn

+2

这并不回答这个问题,甚至作为对OP代码的评论,它的质量也是有问题的。 – 2016-08-19 19:05:05

相关问题