9

でのシステム コールの動作と同様にint 0x80、カーネル内に独自の ISR を実装して、softirq で想定するint 0x120か、他の softirq プログラム カウンターでユーザー空間からカーネル空間にジャンプできるようにすることは可能ですか?

特権モードでカーネルに入ることは のみに関連付けられていますint 0x80か、または任意の softirq 実装に関連付けられていますか? 自動的に特権モードに入ることができますか、または関連するフラグを書き込むことによって手動で保護モードを無効にして特権モードに入る必要がありますか?

もう1つ、このタイプのISRを実装できる場合、データ交換の最良の方法はレジスタEBX、ECX、EDX、ESI、EDI、およびEBPを使用することですか、それとも他の方法がまだありますか?

Linuxカーネルで独自の新しいsoftirqを定義してトリガーする方法はすでに見ましたか? しかし、私が探していた解決策が得られませんでした。

なぜこれが必要なのかをもう少し明確にします。
ハードウェア周辺機器と直接通信するいくつかのカーネル関数を実装しました。ソフトウェア割り込みを使用してユーザー空間からそれらをトリガーしたいのです。実行時間を短縮する必要があるため、利用可能なドライバー アーキテクチャでシステム コールを使用できません。

4

1 に答える 1

4

まず、ソフトウェア割り込みと softirq は完全に異なります。ソフトウェア割り込みは、ユーザー モードから特権モードに切り替えるアセンブリ命令であり、これが探しているものです。softirq は、ハードウェア割り込みハンドラーを上半分と下半分に分割するメカニズムです。

あなたの質問について - アセンブリ コードを記述し、プラットフォーム固有のコードを変更する必要があります

  1. Linux で int 番号を定義する必要がありますarch/x86/include/asm/irq_vectors.h

    #define MY_SYSCALL_VECTOR             0x120
    
  2. Linux で関数 trap_init を変更しますarch/x86/kernel/traps.c

    set_system_trap_gate(MY_SYSCALL_VECTOR, entry_INT120_32);
    
  3. ここで、アセンブリ関数を記述する必要がありますentry_INT120_32。ファイルで例を見ることができます:arch/x86/entry/entry_32.Sで始まりますENTRY(entry_INT80_32)

ファイルの冒頭に記載されているように、CPU レジスタを処理する必要がありentry_32.Sます。

于 2016-04-18T21:01:21.770 に答える