gpt4 book ai didi

c - 在驱动程序代码中打印指针时 %llx 和 %p 之间的区别

转载 作者:行者123 更新时间:2023-12-02 20:19:27 26 4
gpt4 key购买 nike

似乎正在类型转换 void*指向 unsigned long long 的指针(由 kmalloc 分配)改变它。使用 %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

最佳答案

摘自printk()(pr_info 调用)的文档:

Pointer Types

Pointers printed without a specifier extension (i.e unadorned %p) are hashed to give a unique identifier without leaking kernel addresses to user space. On 64 bit machines the first 32 bits are zeroed. If you really want the address see %px below.

所以,这是一项安全措施。使用 %px 格式说明符打印真实地址(现在应该匹配)

关于c - 在驱动程序代码中打印指针时 %llx 和 %p 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60411605/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com