Linux内核 - 为什么一个函数在System.map地址为实时看到自己的地址之前的一个字节?(L

2019-07-17 18:18发布

在Linux内核源代码,附加在该行tasklet_action代码:

printk("tasklet_action = %p\n" , *tasklet_action);
printk("tasklet_action = %p\n" , &tasklet_action);
printk("tasklet_action = %p\n" , tasklet_action);

在输出我得到:

tasklet_action = c03441a1
tasklet_action = c03441a1
tasklet_action = c03441a1

但在搜索时它system.map文件tasklet_action地址是在c03441a0所以有一个1个字节偏移。

  • 我为什么会有这种偏差?
  • 难道总是一个字节偏移?

Answer 1:

我的猜测是,你是在ARM 在Thumb模式下运行,或使用函数指针的底位,表示在运行的模式中的某些其他架构。

如果是的话,答案是你真正的功能是位于在system.map地址

你在运行时的值是位置和方式

说明,在这类架构中,必须始终2或4字节对齐,这会使底位始终为零。 当架构增长的额外模式的设计者利用了“浪费”位的编码方式。 它很聪明,但令人困惑,而不是只为你:很多的软件,如调试器,打破了很多讨厌的方式时,这首先发明的。

概念是谁是用来进行可变长度指令的任何随机取向的x86程序员特别混乱。



文章来源: Linux Kernel - why a function's address in System.map is one byte preceding its address as seen in real time?