x86のローカルAPICから読み書きできるLinuxカーネルモジュール用のコードをいくつか記述しようとしています。私は、割り込みコマンドレジスタから読み出すために以下のコードを使用しています:メモリにマッピングされたローカルAPICレジスタには1だけが含まれています
printk(KERN_ERR "APIC %p %d", (int32_t *)(APIC_BASE + 0x300),
*(volatile int32_t *)(APIC_BASE + 0x300));
これは変わることはありません出力、次のとおりです。私は32ビットの符号付きをプリントアウトしていますので
APIC ffffffffff5f5300 -1
整数、-1
は、私が読んだ32ビットがすべて1であることを示します。 IPIを送信するためにローカルのAPICに書き込む前に、(私の理解では)ビット11(宛先モードビット)を0にする必要があるので、これは予期しないことです。
私が間違っていることはありますか?私が取る必要がある初期化のステップはありますか?
いくつか確認する必要があります:APIC_BASEは正しいですか? APIC領域はマップされていますか? x2APIC **は有効になっていませんか? (IA32_APIC_BASEのビット10は0にする必要があります)。宛先モードビット(ICRのビット11)は保留中のIPIのインジケータではないことに注意してください(ビット12、配信ステータス、is)。 –
@MargaretBloomこんにちはマーガレット - ありがとうございます。実際にはコンピュータにはx2APICが搭載されているように見えるので、メモリマップドレジスタではなくMSRを使用するAPICコードを記述しています。これが完了したら私はアップデートを投稿します。ありがとう! –