2

gate_desc *idt_tableカーネルモジュールで使用しようとしています。set_trap_gate() desc.h で定義されている関数は、このポインターを使用します。desc.h には次の定義もありますextern gate_desc idt_table[]

私はさまざまなことを試しました:

  • idt_table定義や影響なしにモジュールで使用する
  • idt_table私の(有効な)idt_tableアドレスに影響しますid_tableコンパイル中に未定義の警告が表示されるか、 idt_table.

  • たとえば、という名前の新しい var を作成し、、、、関数をsched.h からモジュール ファイルにコピーします (名前を変更し、代わりにそれを使用しますgate_desc *it = (gate_desc *)@;) 。これは問題なくコンパイルされますが、モジュールを挿入すると、unknown symbol in module (ret -1) エラーが発生します。(私のモジュールには idt_table への参照はなく、sched から使用する関数は私の変数を使用します)。set_trap_gateset_gatewrite_idt_entrypack_gateidt_table

sched.h に含まれるファイルのどこに定義されているかを確認しようとしましたが、idt_table見つかりませんでした。

sched.h の idt_table ポインター (正しいアドレスに影響を与える) を使用する方法、または新しいポインターを作成する方法を誰かが知っていますか?

4

1 に答える 1

0

理論的には、次の方法で非初期化セクションを実装できますset_trap_gate()

void set_trap_gate(int n, void *addr)
{
    struct { uint16_t lim; struct desc_struct *idt_table; }
        __attribute__((packed)) idt;
    __asm__ ("sidt %0" : : "m"(idt) : "memory");
    _set_gate(idt.idt_table + n, 15, 0, addr);
}

しかし、それは CPU ローカルです。つまり、他の IDT を変更することは保証されていませんが、それが実行されている CPU の 1 つを変更することは保証されていません。また、書き込み保護されたメモリに違反する可能性があります。

あなたが達成しようとしているのは正確には何ですか?

于 2011-03-15T11:56:23.967 に答える