14

在 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 个字节的偏移量。

  • 为什么我有这个偏移量?
  • 它总是一个字节的偏移量吗?
4

1 回答 1

18

我的猜测是您在 ARM 上以 Thumb 模式运行,或者在其他一些使用函数指针的底部位指示运行模式的架构上运行。

如果是这样,答案是您的函数确实位于 system.map 中的地址

您在运行时获得的值是 location和 mode

在这类架构上,指令必须始终是 2 或 4 字节对齐的,这将使底部位始终为零。当架构增加了一个额外的模式时,设计人员利用“浪费”位来编码模式。它很聪明,但令人困惑,而且不仅对您而言:很多软件,如调试器,在首次发明时以许多令人讨厌的方式破坏。

对于习惯于使用任何随机对齐的可变长度指令的 x86 程序员来说,这个概念尤其令人困惑。

于 2013-01-02T15:55:52.427 回答