我最近开始编写一个本地管理程序,为了支持多核系统,我必须在所有内核上初始化管理程序。使用 Intel 的 x2APIC,我将 SIPI 中断从 BSP 发送到其他内核。发出中断后,我无法使用函数名称调用驻留在不同文件(C 函数)中的函数。当我试图这样做时,CPU 遇到了三重故障。
代码如下所示(使用 生成objdump -dj .text
):
000000000330049c <ApicLongMode>:
330049c: mov $0x770000,%esp
33004a1: mov 0x4000,%rdi
33004a9: callq 3303a2c <InitializeSingleHypervisor>
但是,当使用函数的地址而不是函数名时,调用会成功:
000000000330049c <ApicLongMode>:
330049c: mov $0x770000,%esp
33004a1: mov 0x4000,%rdi
33004a9: callq *0x4008
在上述情况下,地址0x4008
包含InitializeSingleHypervisor
函数的地址。
请注意,当我从 BSP 运行完全相同的代码(第一段代码)时,该函数被成功调用。
我nasm
用作汇编器和ld
链接器。当然,我已经确保在调用它之前将函数声明为 extern。
有人可以解释这种行为吗?