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