2

我最近开始编写一个本地管理程序,为了支持多核系统,我必须在所有内核上初始化管理程序。使用 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。

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

4

0 回答 0