printk 使用 %p 打印的地址和你预想的不一样???

在linux内核中,直接使用%p打印出的地址时经过哈希运算的,为了防止直接暴露内核地址为攻击者提供了有关内核布局的敏感信息。

要打印内核的虚拟地址,可使用 %pK。

在Ubuntu中  /proc/sys/kernel/kptr_restrict 的值为1,可以用%pK打印内核中的运算的地址,

eg:
 

    static char n = 5;
    char *recv_addr = &n;

    printk("recv_addr:  %pK\n", recv_addr);
    printk("recv_addr+1:  %pK \n", recv_addr+1 );    
    printk("recv_addr+2:  %pK \n", recv_addr+2 );

打印结果为:

[30409.301617] recv_addr:  ffffffffc05e7000
[30409.301618] recv_addr+1:  ffffffffc05e7001
[30409.301618] recv_addr+2:  ffffffffc05e7002

 

详细讲解请参考:

linux printk

https://lwn.net/Articles/737451/

https://blog.csdn.net/flyingnosky/article/details/97407811

 

 

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐