似乎强制转换了一个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
从printk()
pr_info调用的文档中:
指针类型
对没有说明符扩展名(即未修饰的%p)打印的指针进行哈希处理以提供唯一的标识符,而不会将内核地址泄漏到用户空间。在64位计算机上,前32位被清零。如果您确实 想要该地址,请参见下面的%px。
因此,这是一种安全措施。使用%px
格式说明符来打印实际地址(现在应该匹配)
该文档可从www.kernel.org/../printk-formats.html获得。