当前位置: 首页 > 面试题库 >

Linux内核-实时查看为什么System.map中的函数地址比其地址早一个字节?

孔经武
2023-03-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地址时,地址为c03441a01字节。

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

问题答案:

我的猜测是您正在 以Thumb模式 在ARM 上运行 ,或者在其他使用功能指针的最低位指示运行模式的体系结构上运行。

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

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

在这类架构上,指令必须始终对齐2或4字节,这将使最低位始终为零。当体系结构增加了额外的模式时,设计人员利用“浪费”位对模式进行编码。这很聪明,但很困惑,而且不仅仅针对您:初次发明时,许多软件(例如调试器)以许多讨厌的方式损坏。

对于习惯于使用任意随机对齐方式来可变长度指令的x86程序员而言,此概念尤其令人困惑。



 类似资料:
  • 问题内容: 除了手动浏览页面目录条目之外,是否有任何合适的方法可以通过逻辑地址获取物理地址?我在内核的源代码中寻找了此功能,并发现有一个功能可以很好地利用内置的巨大和透明页面支持。但是它没有导出到内核模块(为什么?)… 因此,我不想发明轮子,我认为手动重新实现功能不是很好。 问题答案: 好吧,它看起来可能像这样(在虚拟地址后跟随PTE):

  • 问题内容: 在Javadoc中,Object.hashCode()指出 在合理可行的范围内,由class定义的hashCode方法确实为不同的对象返回不同的整数。(这通常是通过将对象的 内部地址 转换为整数来实现的,但是Java™编程语言不需要此实现技术。) 这是一个常见的误解,它与内存地址有关,但没有关系,因为它可以在不通知的情况下发生更改,并且hashCode()不会更改,也不得针对对象更改。

  • 本文向大家介绍python中查看变量内存地址的方法,包括了python中查看变量内存地址的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了python中查看变量内存地址的方法。分享给大家供大家参考。具体实现方法如下: 这里可以使用id 希望本文所述对大家的Python程序设计有所帮助。

  • 问题内容: 我知道Go没有任何构造函数,而是在其中使用a ,但是根据此示例。 他们总是回来。为什么仅仅返回就还不够? 更新资料 我尝试过为简单的结构返回创建的对象,这很好。因此,我想知道返回地址是否是构造函数的标准方法或其他方法。 谢谢。 问题答案: 如前所述,是的,规范允许您返回值(作为非指针)或指针。这只是您必须做出的决定。 什么时候返回指针? 通常,如果您返回的值作为指针“更有用”。什么时候

  • 问题内容: 这是执行代码 当我执行它时,它给我以下输出 正确地将cx解释为指针。但是,当我打印cx时,它会打印,而当我打印或格式化cx时,它会正确地打印地址。为什么会这样呢? 问题答案: 默认的打印动词使用是。虽然在打印区分价值VS指针值,这就是为什么你看到前面。 接下来,您具体告诉使用动词,请参阅“ 打印”部分,然后进行打印。

  • 问题内容: 这是一个要阐述的问题:为什么说内核在进程地址空间中? 这可能是一个愚蠢的问题,但在我脑海中浮现出来。有关进程地址空间和虚拟内存布局的所有文字都提到进程地址空间具有为内核保留的空间。例如,在32位系统上,进程地址空间为4GB,其中1 GB为Linux中的内核保留(其他OS上可能有所不同)。 我只是想知道为什么当进程无法直接寻址内核时,为什么说内核位于进程地址空间中。为什么我们不说内核具有