我试图在内核模块中使用gate_desc *idt_table
。在desc.h中定义的set_trap_gate()
函数使用此指针。在desc.h中还有一个定义:extern gate_desc idt_table[]
。
我尝试了不同的方法:
在我的模块中使用idt_table
,无需定义或装模作样
用我的(有效的)地址影响
在编译过程中,我会收到未定义的警告,或者idt_table
的类型不完整。
创建一个名为instanceidt_table
的新变量,并将sched.h中的id_table
,idt_table
,gate_desc *it = (gate_desc *)@;
,set_trap_gate
函数复制到我的模块文件(重命名它们,并使用它而不是set_gate
)。这编译得很好,但是在插入模块时,模块中出现未知符号(ret-1)错误。
(在我的模块中没有对idt_表的引用,我在sched中使用的函数确实使用了我的变量)。
我试图查看sched.h包含的文件中定义了write_idt_entry
的位置,但找不到!
有人知道我如何使用sched.h中的idt_表指针(用正确的地址影响它)还是创建一个新指针?
最佳答案
理论上,您可以通过以下途径实现非init部分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之一。而且,它可能会与writeprotected内存相冲突。
你到底想达到什么目的?