Autor Thema: IDT in C?  (Gelesen 4450 mal)

Noobtotal

  • Beiträge: 54
    • Profil anzeigen
Gespeichert
« am: 22. March 2007, 14:57 »
Hallo Leute, kann man eine IDT in C schreiben?
Wenn ja, passt das mit folgendem Code?
:

void IDT
{
short int Limit;
int Base;
char IDT[255*8];
Limit=255*8;
Base=&IDT;
return
}

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 22. March 2007, 15:10 »
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.
« Letzte Änderung: 22. March 2007, 15:16 von PorkChicken »
Dieser Text wird unter jedem Beitrag angezeigt.

Noobtotal

  • Beiträge: 54
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 22. March 2007, 15:32 »
OK Than ks!

 

Einloggen