最近、ネイティブ ハイパーバイザーの作成を開始しました。マルチコア システムをサポートするには、すべてのコアでハイパーバイザーを初期化する必要があります。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,%esp
33004a1: mov 0x4000,%rdi
33004a9: callq *0x4008
上記の場合、0x4008
アドレスには関数のアドレスが含まれていInitializeSingleHypervisor
ます。
BSP からまったく同じコード (コードの最初の部分) を実行すると、関数が正常に呼び出されることに注意してください。
nasm
アセンブラとld
リンカとして使用しています。もちろん、関数を呼び出す前に extern として宣言するようにしました。
誰かがこの動作を説明できますか?