【发布时间】:2011-07-15 05:10:07
【问题描述】:
我正在尝试在内核模块中使用gate_desc *idt_table。 desc.h 中定义的set_trap_gate() 函数使用此指针。在 desc.h 中还有一个定义:extern gate_desc idt_table[]。
我尝试了不同的方法:
- 在我的模块中使用
idt_table,无需定义或做作 用我的(有效)
idt_table地址影响idt_table我在编译期间收到id_tableundefined 警告或idt_table的类型不完整。创建一个名为例如
gate_desc *it = (gate_desc *)@;的新变量并将set_trap_gate、set_gate、write_idt_entry、pack_gate函数从 sched.h 复制到我的模块文件(重命名它们并使用它而不是idt_table)。这编译得很好,但是在插入我的模块时,我在模块(ret -1)错误中得到一个未知符号。 (我的模块中没有对 idt_table 的引用,并且我在 sched 中使用的函数确实使用了我的变量)。
我试图查看 sched.h 包含的文件在哪里定义了idt_table,但找不到!
有人知道我可以如何使用 sched.h 中的 idt_table 指针(通过正确的地址影响它)或创建一个新指针吗?
【问题讨论】:
-
从内核模块执行此类操作是不安全的,并且无论如何都不能在 SMP 系统上工作,因为您将只修改一个 CPU 内核的表(它们不一定保证共享)。使用它仅限于内核初始化(这就是为什么它被标记为
__init)。你到底想要达到什么目的?
标签: c linux module kernel interruption