diff --git a/build/OwOS.bin b/build/OwOS.bin index d9402b5..1ddf996 100755 Binary files a/build/OwOS.bin and b/build/OwOS.bin differ diff --git a/build/OwOS.iso b/build/OwOS.iso index d4a0ab8..0878a08 100644 Binary files a/build/OwOS.iso and b/build/OwOS.iso differ diff --git a/iso/boot/OwOS.bin b/iso/boot/OwOS.bin index d9402b5..1ddf996 100644 Binary files a/iso/boot/OwOS.bin and b/iso/boot/OwOS.bin differ diff --git a/kernel.cpp b/kernel.cpp index c342aa8..beca0a0 100644 --- a/kernel.cpp +++ b/kernel.cpp @@ -8,8 +8,6 @@ #include #include -#define BochsBreak() outw(0x8A00,0x8A00); outw(0x8A00,0x08AE0); - extern "C" { extern void INIT_FPU(void); } diff --git a/kernel/gdt.cpp b/kernel/gdt.cpp index 1b670f3..4416502 100644 --- a/kernel/gdt.cpp +++ b/kernel/gdt.cpp @@ -4,47 +4,58 @@ #include struct SegmentDescriptor_t { - uint16_t limit_0; - uint16_t base_0; - uint8_t base_1; + uint16_t limit_low; + uint16_t base_low; + uint8_t base_middle; uint8_t access; - uint8_t limit_1:4; - uint8_t flags:4; - uint8_t base_2; + uint8_t granularity0:4; + uint8_t granularity1:4; + uint8_t base_high; } __attribute__((packed)); -SegmentDescriptor_t _GDT[256]; +struct GDT_t { + uint16_t limit; + uint32_t base; +} __attribute__((packed)); -void lgdt(void* GDT, uint16_t size) { +SegmentDescriptor_t _GDT[5]; +GDT_t _GDTptr; + +void lgdt(void* base, uint16_t size) { struct { - uint16_t size; - void* GDT; - } __attribute__((packed)) GDTR = { size, GDT }; + uint16_t length; + void* base; + } __attribute__((packed)) GDTR = { size, base }; - asm ( "lgdt %0" : : "m"(GDTR) ); -} + asm ( "lgdt %0" : : "m"(GDTR) );} void initGDT() { - memset(&_GDT, 0, sizeof(_GDT)); + #define BochsBreak() outw(0x8A00,0x8A00); outw(0x8A00,0x08AE0); + _GDTptr.limit = (sizeof(SegmentDescriptor_t) * 5) - 1; + _GDTptr.base = (uint32_t)&_GDT; - // Leave 0 blank for null segment + // Null segment + setGDTGate(0, 0, 0, 0, 0); // Code Base 0 limit 32 Access EXEC + RW - setGDT(1, 0x00000000, 0xFFFFFFFF, GDT_ACCESS_PRESENT | GDT_ACCESS_EXEC | GDT_ACCESS_RW, GDT_FLAG_GR_PAGE | GDT_FLAG_SZ_32B); + setGDTGate(1, 0x00000000, 0xFFFFFFFF, GDT_ACCESS_PRESENT | GDT_ACCESS_EXEC | GDT_ACCESS_RW, GDT_FLAG_GR_PAGE | GDT_FLAG_SZ_32B); // Data Base 0 Limit 32 Access RW - setGDT(2, 0x00000000, 0xFFFFFFFF, GDT_ACCESS_PRESENT | GDT_ACCESS_RW, GDT_FLAG_GR_PAGE | GDT_FLAG_SZ_32B); + setGDTGate(2, 0x00000000, 0xFFFFFFFF, GDT_ACCESS_PRESENT | GDT_ACCESS_RW, GDT_FLAG_GR_PAGE | GDT_FLAG_SZ_32B); lgdt(&_GDT, sizeof(_GDT)); + BochsBreak(); SEGMENTS_RELOAD(); } -void setGDT(uint32_t index, uint32_t baseAddr, uint32_t limitAddr, uint8_t accessLvl, uint8_t flags) { - if (index > 256) return; - _GDT[index].base_0 = (baseAddr >> 0) & 0xFFFF; - _GDT[index].base_1 = (baseAddr >> 16) & 0xFF; - _GDT[index].base_2 = (baseAddr>> 24) & 0xFF; - _GDT[index].limit_0 = (limitAddr >> 0) & 0xFFFF; - _GDT[index].limit_1 = (limitAddr >> 16) & 0x0F; - _GDT[index].access = accessLvl; - _GDT[index].flags = flags & 0x0F; +void setGDTGate(uint32_t index, uint32_t baseAddr, uint32_t limitAddr, uint8_t accessLvl, uint8_t flags) { + if (index > 5) return; + _GDT[index].base_low = (baseAddr & 0xFFFF); + _GDT[index].base_middle = (baseAddr >> 16) & 0xFF; + _GDT[index].base_high = (baseAddr >> 24) & 0xFF; + + _GDT[index].limit_low = (limitAddr >> 0) & 0xFFFF; + _GDT[index].granularity0 = (limitAddr >> 16) & 0x0F; + + _GDT[index].granularity1 = flags & 0x0F; + _GDT[index].access = accessLvl; } diff --git a/kernel/gdt.h b/kernel/gdt.h index e3af32c..8049c91 100644 --- a/kernel/gdt.h +++ b/kernel/gdt.h @@ -20,4 +20,4 @@ extern "C" { } void initGDT(); -void setGDT(uint32_t index, uint32_t baseAddr, uint32_t limitAddr, uint8_t accessLvl, uint8_t flags); +void setGDTGate(uint32_t index, uint32_t baseAddr, uint32_t limitAddr, uint8_t accessLvl, uint8_t flags); diff --git a/kernel/segment.asm b/kernel/segment.asm index cc491bf..e86ea65 100644 --- a/kernel/segment.asm +++ b/kernel/segment.asm @@ -1,13 +1,14 @@ .global SEGMENTS_RELOAD SEGMENTS_RELOAD: - ljmp $0x08, $reloadCS - -reloadCS: movw $0x10, %ax - movw %ax, %es - movw %ax, %ss movw %ax, %ds + movw %ax, %es movw %ax, %fs movw %ax, %gs + movw %ax, %ss + ljmp $0x08, $flush2 + +flush2: ret + \ No newline at end of file