3
« 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