温馨提示:本文翻译自stackoverflow.com,查看原文请点击:c - Difference between %llx and %p while printing a pointer inside driver code
c driver linux-device-driver linux-kernel

c - 在驱动程序代码内打印指针时,%llx和%p之间的差异

发布于 2020-05-15 09:46:31

似乎强制转换了一个void*指针(由kmalloc分配)以unsigned long long更改它。%p打印它们%llx会给出不同的值。为什么会这样呢?谁能解释?

以下是对此的简单复制:

#include <linux/module.h>
#include <linux/slab.h>
#include <linux/init.h>

void* kbuff;
int init_module(void)
{

    kbuff = kzalloc(sizeof(char), GFP_KERNEL);
    pr_info("%p %llx\n",kbuff, (unsigned long long)kbuff);
    return 0;
}

void cleanup_module(void)
{
    kfree(kbuff);
}

dmesg输出出来是如下

[67355.673465] 000000003aeb0247 ffff9ef657a58c00

查看更多

提问者
atuly
被浏览
44
Ctx 2020-02-26 19:15

printk()pr_info调用的文档中

指针类型

对没有说明符扩展名(即未修饰的%p)打印的指针进行哈希处理以提供唯一的标识符,而不会将内核地址泄漏到用户空间。在64位计算机上,前32位被清零。如果您确实 想要该地址,请参见下面的%px。

因此,这是一种安全措施。使用%px格式说明符来打印实际地址(现在应该匹配)