idt_table не определено!предупреждение при компиляции модуля ядра - PullRequest
2 голосов
/ 14 марта 2011

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

0 голосов
/ 15 марта 2011

Теоретически, вы можете реализовать не-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);
}

Но это будет локально для ЦП, т. Е. Не гарантируется изменение любой другой IDT, кроме той, на которой он работает. Кроме того, это может привести к загрязнению памяти, защищенной от записи.

Чего именно ты хочешь достичь?

...