idt_table не определено! предупреждение при компиляции модуля ядра

Я пытаюсь использовать 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,

  • создавая новую переменную с именем, например, 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, но не смог найти его!

Кто-нибудь знает, как я мог бы использовать указатель idt_table из sched.h (влияющий на него с помощью правильного адреса) или создать новый указатель?

1 ответ

Теоретически, вы могли бы реализовать не-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, кроме той, на которой он работает. Кроме того, это может привести к загрязнению памяти, защищенной от записи.

Что именно вы пытаетесь достичь?

Другие вопросы по тегам