2

最近、ネイティブ ハイパーバイザーの作成を開始しました。マルチコア システムをサポートするには、すべてのコアでハイパーバイザーを初期化する必要があります。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 として宣言するようにしました。

誰かがこの動作を説明できますか?

4

0 に答える 0