Das kannst du so machen.
Allerdings brauchst du nicht jedes gate definieren.
Es ist effektiver und sicher wenn du nicht jeden Eintrag definierst.
Am besten ist es, wenn du nur die Gates definierst, die du auch wirklich brauchst.
Den Rest kannst du mit NULL auffüllen.
So könnte eine Methode aussehen:
void idt_set_gate(uint16_t num , uint32_t base , uint16_t sel , uint8_t attr){
if(num < IDT_SIZE){
if(IDT[num].offset_low != NULL)
panic("Tried to write into a set IDT-Entry" , NO_CPU_STATE);
IDT[num].offset_low = (base & 0xFFFF);
IDT[num].offset_high = (base >> 16) & 0xFFFF;
IDT[num].selector = sel;
IDT[num].zero = 0;
IDT[num].attribute = attr;
}
else
panic("Tried to set a wrong interrupt-gate" , NO_CPU_STATE);
}
Bei mir sehen die Gates wie folgt aus:
typedef struct{
uint16_t offset_low;
uint16_t selector;
uint8_t zero;
uint8_t attribute;
uint16_t offset_high;
}id_table;
Der Call sieht dann für die Division by zero Exception so aus:
idt_set_gate(0, (unsigned)intr_0, 0x08, IDT_STD_GATE);