打印内核指针通常是一个坏主意,因为它基本上意味着将内核地址泄漏到用户空间,因此,在使用%p
in printk
(或类似的宏pr_info
等,诸如此类)时,内核会尝试保护自己而不打印实际地址。而是为该地址打印一个不同的哈希唯一标识符。
如果您确实要打印该地址,可以使用%px
。
从Documentation/kprintf-formats.txt
(web)或Documentation/core-api/printk-formats.rst
(git):
指针类型对没有说明符扩展名(即未修饰
%p
)打印的指针进行哈希处理以提供唯一的标识符,而不会将内核地址泄漏给用户空间。在64位计算机上,前32位被清零。如果您真的 想要地址,请参见%px
下文。%p abcdef12 or 00000000abcdef12
然后,下面的内容:
未修改的地址%px 01234567 or 0123456789abcdef
当您确实要打印地址时用于打印指针。使用来打印指针之前,请考虑是否在内存中泄漏了有关内核布局的敏感信息
%px
。%px
在功能上等效于%lx
。%px
首选,%lx
因为它更具唯一性。如果将来我们需要修改内核处理打印指针的方式,那么能够找到调用站点将非常不错。