Hi,
nein so geht das nicht. Deine IDT hat erstmal nur 255 Einträge, ich vermute du wolltest 256 haben. Außerdem sind die Variablen Limit und Base nicht so auf dem Stack positioniert, wie es die Struktur, die du mit LIDT laden kannst, vorschreibt.
char IDT[256 * 8]; // Die IDT muss global sein, sonst verschwindet sie, wenn du die Funktion LoadIDT() verlässt.
void LoadIDT() // <-- () nicht vergessen, und 2x der selbe Name für verschiedene Sachen ist auch nicht so gut
{
// Definition der Struktur des IDTR und gleich mit Werten beladen
struct {
unsigned short limit;
unsigned int base;
} __attribute__((packed)) idt_ptr = {
.limit = 256*8 - 1, // beim Limit immer 1 abziehen
.base = (unsigned int)IDT, // kein &IDT hier, weil das die Adresse der Variable wäre und nicht die der IDT
};
// außerdem musst du die IDT laden
asm("lidt %0" : : "m" (idt_ptr));
}
Das
__attribute__((packed)) sorgt dafür, dass die Variablen limit und base direkt hintereinader liegen. Ohne das Attribut würde der GCC 2 Byte Platz zwischen den Variablen lassen, weil dadurch der Zugriff auf .base schneller geht.
In diesem Beispiel definiere, instanziere und initialisiere ich das struct in einem Befehl. Wenn du willst, kannst du das natürlich auch alles trennen.
Ich war außerdem mal so frei und hab den Code zum Laden der IDT angehängt.
Die IDT das char[] zu definieren ist auch ziemlich unpraktisch. Vielleicht solltest du stattdessen ein struct nehmen. Das solltest du dann auch mit __attribute__((packed)) packen, um sicher zu gehen, dass es 8 Byte groß ist.