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.

  • 创建一个名为 instance 的新 var 并将, , ,函数从 sched.h 复制到我的模块文件(重命名它们,并使用它而不是gate_desc *it = (gate_desc *)@;)。这编译得很好,但是在插入我的模块时,我在模块(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 之一。此外,它可能会与写保护内存发生冲突。

你到底想要达到什么目的?

于 2011-03-15T11:56:23.967 回答