在其他内核上运行时,无法使用带有函数名称的调用指令

问题描述

我最近开始编写本机管理程序,并且为了支持多核系统,我必须在所有内核上初始化管理程序。 使用Intel的x2APIC,我正在从BSP向其他内核发送SIPI中断。发出中断后,我无法使用该函数名称调用驻留在其他文件中的函数(C函数)。当我尝试这样做时,cpu会遇到三重故障。

代码如下(使用objdump -dj .text生成):

000000000330049c <ApicLongMode>:
330049c: mov    $0x770000,%esp
33004a1: mov    0x4000,%rdi
33004a9: callq  3303a2c <InitializeSingleHypervisor>

但是,使用函数的地址而不是函数名称时,调用会成功:

000000000330049c <ApicLongMode>:
330049c: mov    $0x770000,%rdi
33004a9: callq  *0x4008

在上述情况下,地址0x4008包含InitializeSingleHypervisor函数的地址。

请注意,当我从BSP运行完全相同的代码(第一段代码)时,该函数将成功调用

我正在将nasm用作汇编程序,并将ld用作链接程序。当然,我必须确保在调用函数之前将其声明为extern。

有人可以解释这种行为吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)