gpt4 book ai didi

c - Linux Kernel - 为什么一个函数在 System.map 中的地址比实时看到的地址早一个字节?

转载 作者:IT王子 更新时间:2023-10-29 00:25:23 29 4
gpt4 key购买 nike

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

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

最佳答案

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

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

您在运行时获得的值是位置和模式

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

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

关于c - Linux Kernel - 为什么一个函数在 System.map 中的地址比实时看到的地址早一个字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14120711/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com