idt_表未定义!编译内核模块时出现警告

发布于 2024-10-21 18:42:34 字数 852 浏览 8 评论 0原文

我正在尝试在内核模块中使用 gate_desc *idt_table 。 desc.h 中定义的 set_trap_gate() 函数使用此指针。在 desc.h 中还有一个定义:extern gateway_desc idt_table[]

我尝试了不同的方法:

  • 在我的模块中使用 idt_table 而没有定义或影响
  • 影响 idt_table 与我的(有效)idt_table 地址 我在编译期间收到 id_table undefined 警告,或者 idt_table 类型不完整。

  • 创建一个新的变量,例如 gate_desc *it = (gate_desc *)@; 并复制 set_trap_gate, set_gate, write_idt_entrypack_gate 函数从 sched.h 到我的模块文件(重命名它们,并使用它而不是 idt_table)。这编译得很好,但是当插入我的模块时,我在模块中收到未知符号 (ret -1) 错误。 (我的模块中没有对 idt_table 的引用,并且我从 sched 中使用的函数确实使用了我的变量)。

我试图查看 sched.h 包含的文件中定义了 idt_table 的位置,但找不到它!

有人知道我如何使用 sched.h 中的 idt_table 指针(用正确的地址影响它)或创建一个新指针吗?

I'm trying to use gate_desc *idt_table in a kernel module. The set_trap_gate() function defined in desc.h uses this pointer. In desc.h is also a definition : extern gate_desc idt_table[].

I tried different things:

  • use idt_table in my module without definition or affectation
  • affect idt_table with my (valid) idt_table address
    I get either an id_table undefined warning during compilation or incomplete type for idt_table.

  • creating a new var named for instance gate_desc *it = (gate_desc *)@; And copy the set_trap_gate, set_gate, write_idt_entry, pack_gate functions from sched.h to my module file (renaming them, and using it instead of idt_table). This compiles fine but when inserting my module I get an unknown symbol in module (ret -1) error.
    (there is no reference in my module to idt_table, and the functions I use from sched do use my variable).

I tried to see where in the files included by sched.h was defined idt_table, but couldn't find it!

Does someone know how I could use, the idt_table pointer from sched.h (affecting it with the corrct address) or create a new pointer?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

再见回来 2024-10-28 18:42:34

理论上,您可以通过以下方式实现非 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 本地的,即不能保证修改除运行它的 CPU 之外的任何其他 IDT 。此外,它可能会与写保护内存发生冲突。

您到底想实现什么目标?

Theoretically, you could implement a non-init-section set_trap_gate() via:

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);
}

But that'd be CPU-local, i.e. it's not guaranteed to modify any other IDT but the one of the CPU it's running on. Also, it might fall foul of writeprotected memory.

What exactly is it you're trying to achieve ?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文