Beiträge anzeigen

Diese Sektion erlaubt es dir alle Beiträge dieses Mitglieds zu sehen. Beachte, dass du nur solche Beiträge sehen kannst, zu denen du auch Zugriffsrechte hast.


Nachrichten - Niklas

Seiten: [1]
1
Ich habe meinen Fehler gefunden:
Ich habe bei die Definition meiner Flags für die Segmentgröße und breite eine 0 vergessen (0x80 statt 0x800).
In diesem Sinne nochmal vielen Dank an alle, die mir geholfen haben.

Niklas
2
Danke erstmal für die vielen und schnellen Antworten.
Der Kernel hängt sich nach dem neuladen des letzten Registers (mov %ax, %ss) auf. wenn ich diese Zeile auskommentiere, tritt der Fehler in der Zeile davor (mov %ax, %gs) auf.
Ich kann mir darazus allerdings momentan keinen reim bilden...
3
Softwareentwicklung / [C++] OS hängt sich beim Laden der GDT aud
« am: 18. February 2013, 20:36 »
Hallo zusammen,
Ich schreibe grade mithilfe des in der Wiki stehenden OS-Dev-Tutorials und Brans Kernel Tutorial einen kleinen C++-Kernel. Allerdings hängt sich dieser bei dem Laden der GDT auf. Ich bekomme keinen Compilerfehler, denke aber, dass der Fehler irgendwo bei dem erstellen oder laden des Zeigers auf die GDT leigen muss.
Mein Code:
void CGDT::AddEntry(int iEntry,
               uint32_t iBase,
               uint32_t iLimit,
               int iFlags)
{
   m_aGDT[iEntry]  = iLimit & 0xffffLL;
   m_aGDT[iEntry] |= (iBase & 0xffffffLL) << 16;
   m_aGDT[iEntry] |= (iFlags & 0xffLL) << 40;
   m_aGDT[iEntry] |= ((iLimit >> 16) & 0xfLL) << 48;
   m_aGDT[iEntry] |= ((iFlags >> & 0xffLL) << 52;
   m_aGDT[iEntry] |= ((iBase >> 24) & 0xffLL) << 56;
}

void CGDT::Init()
{   
   // First Entry is NULL
   AddEntry(0, 0, 0, 0);
   
   AddEntry(1, 0, 0xFFFFF,
          GDT_FLAG_SEGMENT | GDT_GRAN_32_BIT |
          GDT_FLAG_CODESEG | GDT_GRAN_4K_GRAN |
          GDT_FLAG_PRESENT);
         
   AddEntry(2, 0, 0xFFFFF,
          GDT_FLAG_SEGMENT | GDT_FLAG_DATASEG |
          GDT_FLAG_PRESENT |
          GDT_GRAN_4K_GRAN | GDT_GRAN_32_BIT);
         
   AddEntry(3, 0, 0xFFFFF,
          GDT_FLAG_SEGMENT | GDT_FLAG_CODESEG |
          GDT_FLAG_PRESENT | GDT_FLAG_RING3 |
          GDT_GRAN_4K_GRAN | GDT_GRAN_32_BIT);
         
   AddEntry(4, 0, 0xFFFFF,
          GDT_FLAG_SEGMENT | GDT_FLAG_DATASEG |
          GDT_FLAG_PRESENT | GDT_FLAG_RING3 |
          GDT_GRAN_4K_GRAN | GDT_GRAN_32_BIT);
         
   // Write in GDT
   struct {
      uint16_t limit;
      void* pointer;
   } PACKED gdtp = {
      GDT_ENTRIES * 8 - 1,
      m_aGDT
   };
               
   asm volatile("lgdt %0" : : "m" (gdtp));
   asm("mov $0x10, %ax;"
      "mov %ax, %ds;"
      "mov %ax, %es;"
      "mov %ax, %fs;"
      "mov %ax, %gs;"
      "mov %ax, %ss;");
}
Ich bin mir vor allem unsicher, ob ich den Zeiger auf die GDT mit dem struct richtig erzeuge.

Ich hoffe, das mir jemand helfen kann.
Danke schonmal im Vorraus.
Niklas
Seiten: [1]

Einloggen