2016-04-17 13 views
8

int 0x80でシステムコールを実行するのと同様に、自分のISRをカーネル内で実装することができます。そうすれば、softirqではint 0x120または他のsoftirqプログラムカウンタユーザスペースからカーネルスペースからジャンプできますか?独自のsoftirqでlinuxカーネルを呼び出す方法はありますか

特権モードのカーネルに入っているのは、int 0x80としか関連付けられていないか、softirqの実装で自動的に特権モードに入るか、保護モードを無効にして特権モードに入ることができます。

このタイプのISRを実装することが可能な場合は、EBX、ECX、EDX、ESI、EDI、EBPなどのレジスタを使用したデータ交換が可能です。

私はすでにHow to define and trigger my own new softirq in linux kernel?を見ましたが、私が探していた解決策が見つかりませんでした。

私はこれをもっと必要とする理由を説明します
ハードウェア周辺機器と直接通信しているカーネル機能はほとんど実装されていませんでした。ソフトウェア割り込みを使用してユーザ空間からトリガする必要があります。私は実行時間を短縮する必要があるので、使用可能なドライバアーキテクチャでシステムコールを使用することはできません。

+0

Linuxカーネルは、いったんそれを残すと、[リアルモード](http://wiki.osdev.org/Real_Mode)に再入力しません。ブートローダがその内容を終了すると、適切なOSがCPUがすべて[保護された](http://wiki.osdev.org/Protected_Mode)/ [long](http://wiki.osdev.org/Long_Mode#Long_Mode)モードを再起動します。あなたは[ring 0](https://en.wikipedia.org/wiki/Protection_ring)を意味するのでしょうか? – 3442

+0

はい、私はリング0を意味し、編集しました。ありがとう –

+0

Linuxでカーネルモードに入る最も簡単な方法は、あなた自身のドライバを書くことです。 –

答えて

3

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

- あなたはあなたがLinuxのarch/x86/include/asm/irq_vectors.hにint型の数を定義する必要があるアセンブリコードを記述し、プラットフォーム固有のコード

  1. を変更する必要があります:

    #define MY_SYSCALL_VECTOR    0x120 
    
  2. 変更のLinux arch/x86/kernel/traps.cで関数trap_init:

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

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

+0

これは私が見つけたものであり、あなたの指示に従った流れを理解した。 –

関連する問題