在linux内核源代码中,在tasklet_action代码中添加了以下几行:
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地址时,地址为c03441a01字节。
system.map
c03441a0
我的猜测是您正在 以Thumb模式 在ARM 上运行 ,或者在其他使用功能指针的最低位指示运行模式的体系结构上运行。
如果是这样,答案是您的函数 确实位于system.map中的地址 。
您在运行时获得的值是位置 和模式 。
在这类架构上,指令必须始终对齐2或4字节,这将使最低位始终为零。当体系结构增加了额外的模式时,设计人员利用“浪费”位对模式进行编码。这很聪明,但很困惑,而且不仅仅针对您:初次发明时,许多软件(例如调试器)以许多讨厌的方式损坏。
对于习惯于使用任意随机对齐方式来可变长度指令的x86程序员而言,此概念尤其令人困惑。