2017-11-13 3 views
2

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にする必要があるので、これは予期しないことです。

私が間違っていることはありますか?私が取る必要がある初期化のステップはありますか?

+2

いくつか確認する必要があります:APIC_BASEは正しいですか? APIC領域はマップされていますか? x2APIC **は有効になっていませんか? (IA32_APIC_BASEのビット10は0にする必要があります)。宛先モードビット(ICRのビット11)は保留中のIPIのインジケータではないことに注意してください(ビット12、配信ステータス、is)。 –

+0

@MargaretBloomこんにちはマーガレット - ありがとうございます。実際にはコンピュータにはx2APICが搭載されているように見えるので、メモリマップドレジスタではなくMSRを使用するAPICコードを記述しています。これが完了したら私はアップデートを投稿します。ありがとう! –

答えて

2

私のコンピュータには、xAPICではなく新しいx2APICが搭載されていることが判明しました。 x2APICは、xAPICが使用するメモリマップレジスタではなく、IPRを送信するためにMSRを使用します。したがって、私がAPIC_BASEに読んでいたメモリは、ローカルAPICの状態を表していません。

MSRを使用するようにコードを書き直す予定ですが、xAPICのインターフェイスを使用するようにx2APICを設定することで既存のコードをテストすることができました(代わりにメモリマップレジスタを使用)。これは、nox2apicカーネルパラメータを設定することによって行うことができます。

関連する問題