【问题标题】:idt_table undefined! warning when compiling kernel moduleidt_table 未定义!编译内核模块时出现警告
【发布时间】: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_table undefined 警告或idt_table 的类型不完整。

  • 创建一个名为例如gate_desc *it = (gate_desc *)@; 的新变量并将set_trap_gateset_gatewrite_idt_entrypack_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


【解决方案1】:

理论上,您可以通过以下方式实现非初始化部分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 之一。此外,它可能会与写保护内存发生冲突。

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

【讨论】:

  • 感谢您的回答。事实上,我想使用 desc.h 中提供的函数,如 set_trap_gate 来实现调试寄存器 rootkit 的简单版本(作为学生的学术工作)。为此,我需要在 idt 中替换 INT1 中的 do_debug 处理程序
猜你喜欢
  • 2014-10-26
  • 2021-04-05
  • 1970-01-01
  • 1970-01-01
  • 2016-02-22
  • 2020-09-11
  • 2014-07-07
  • 2014-01-19
  • 1970-01-01
相关资源
最近更新 更多