mirror of
https://github.com/Tom-on64/kern.git
synced 2026-11-03 18:22:22 +00:00
Got GDT working
This commit is contained in:
+7
-5
@@ -17,20 +17,22 @@ multiboot:
|
||||
dd FLAGS
|
||||
dd CHECK
|
||||
|
||||
section .bss
|
||||
align 16
|
||||
|
||||
; Initialize stack
|
||||
stack_bottom:
|
||||
section .bss
|
||||
align 16
|
||||
global __kernel_stack_top
|
||||
global __kernel_stack_bottom
|
||||
__kernel_stack_bottom:
|
||||
resb 16384
|
||||
stack_top:
|
||||
__kernel_stack_top:
|
||||
|
||||
; Entry point
|
||||
section .text
|
||||
global _start
|
||||
extern kmain
|
||||
_start:
|
||||
mov esp, stack_top ; Setup stack
|
||||
mov esp, __kernel_stack_top
|
||||
push eax
|
||||
push ebx
|
||||
call kmain ; Call kernel main
|
||||
|
||||
+22
-60
@@ -2,22 +2,9 @@
|
||||
#include <string.h>
|
||||
#include <gdt.h>
|
||||
|
||||
static struct gdt_entries gdt;
|
||||
static struct gdt_entry gdt[GDT_ENTRIES];
|
||||
static struct gdt_pointer gdtp;
|
||||
static struct tss_pointer tss;
|
||||
struct tss_pointer* tssp = &tss;
|
||||
|
||||
void gdt_loadTss(struct tss_pointer* ptr) {
|
||||
size_t addr = (size_t)ptr;
|
||||
|
||||
gdt.tss.baseLow = (uint16_t)addr;
|
||||
gdt.tss.baseMid = (uint8_t)(addr >> 16);
|
||||
gdt.tss.flags1 = 0x89;
|
||||
gdt.tss.flags2 = 0;
|
||||
gdt.tss.baseHigh = (uint8_t)(addr >> 24);
|
||||
|
||||
__asm__ volatile ("ltr %0" : : "rm"(SEGMENT_SEL(0, 0, 7)));
|
||||
}
|
||||
|
||||
void gdt_reload(void) {
|
||||
__asm__ volatile (
|
||||
@@ -37,66 +24,41 @@ void gdt_reload(void) {
|
||||
);
|
||||
}
|
||||
|
||||
void tss_reload(void) {
|
||||
__asm__ volatile ("ltr %0" : : "rm"(GDT_TSS));
|
||||
gdt[5].access |= 0x02;
|
||||
}
|
||||
|
||||
int gdt_init(void) {
|
||||
// Null descriptor (0)
|
||||
gdt.descriptors[0].limit = 0;
|
||||
gdt.descriptors[0].baseLow = 0;
|
||||
gdt.descriptors[0].baseMid = 0;
|
||||
gdt.descriptors[0].access = 0;
|
||||
gdt.descriptors[0].granulatiry = 0;
|
||||
gdt.descriptors[0].baseHigh = 0;
|
||||
gdt[0] = GDT_DESC(0, 0, 0, 0);
|
||||
|
||||
// Kernel code (8)
|
||||
gdt.descriptors[1].limit = 0xffff;
|
||||
gdt.descriptors[1].baseLow = 0;
|
||||
gdt.descriptors[1].baseMid = 0;
|
||||
gdt.descriptors[1].access = 0x9a;
|
||||
gdt.descriptors[1].granulatiry = 0xcf;
|
||||
gdt.descriptors[1].baseHigh = 0;
|
||||
gdt[1] = GDT_DESC(0xfffff, 0, 0x9a, 0xc);
|
||||
|
||||
// Kernel data (16)
|
||||
gdt.descriptors[2].limit = 0xffff;
|
||||
gdt.descriptors[2].baseLow = 0;
|
||||
gdt.descriptors[2].baseMid = 0;
|
||||
gdt.descriptors[2].access = 0x90;
|
||||
gdt.descriptors[2].granulatiry = 0xcf;
|
||||
gdt.descriptors[2].baseHigh = 0;
|
||||
gdt[2] = GDT_DESC(0xfffff, 0, 0x92, 0xc);
|
||||
|
||||
// SYSENTER/SYSEXIT
|
||||
gdt.descriptors[3] = (struct gdt_entry){ 0 }; // (24)
|
||||
gdt.descriptors[4] = (struct gdt_entry){ 0 }; // (32)
|
||||
// User code (24)
|
||||
gdt[3] = GDT_DESC(0xfffff, 0, 0xfa, 0xc);
|
||||
|
||||
// User code (40)
|
||||
gdt.descriptors[5].limit = 0;
|
||||
gdt.descriptors[5].baseLow = 0;
|
||||
gdt.descriptors[5].baseMid = 0;
|
||||
gdt.descriptors[5].access = 0xfa;
|
||||
gdt.descriptors[5].granulatiry = 0x20;
|
||||
gdt.descriptors[5].baseHigh = 0;
|
||||
// User data (32)
|
||||
gdt[4] = GDT_DESC(0xfffff, 0, 0xf2, 0xc);
|
||||
|
||||
// User data (48)
|
||||
gdt.descriptors[6].limit = 0;
|
||||
gdt.descriptors[6].baseLow = 0;
|
||||
gdt.descriptors[6].baseMid = 0;
|
||||
gdt.descriptors[6].access = 0xf2;
|
||||
gdt.descriptors[6].granulatiry = 0;
|
||||
gdt.descriptors[6].baseHigh = 0;
|
||||
// TSS (40)
|
||||
memset(&tss, 0, sizeof(tss));
|
||||
gdt[5] = GDT_DESC(sizeof(tss) - 1, (uint32_t)&tss, 0x89, 0x00);
|
||||
tss.iopb = sizeof(struct tss_pointer);
|
||||
tss.esp0 = __kernel_stack_top;
|
||||
tss.ss0 = GDT_KERNEL_DATA;
|
||||
|
||||
// TSS (56)
|
||||
gdt.tss.length = 104;
|
||||
gdt.tss.baseLow = 0;
|
||||
gdt.tss.baseMid = 0;
|
||||
gdt.tss.flags1 = 0x89;
|
||||
gdt.tss.flags2 = 0;
|
||||
gdt.tss.baseHigh = 0;
|
||||
|
||||
gdtp.limit = sizeof(struct gdt_entries) - 1;
|
||||
// GDT Pointer
|
||||
gdtp.limit = sizeof(gdt) - 1;
|
||||
gdtp.base = (uint32_t)&gdt;
|
||||
|
||||
gdt_reload();
|
||||
tss_reload();
|
||||
|
||||
memset(tssp, 0, sizeof(struct tss_pointer));
|
||||
gdt_loadTss(tssp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -27,7 +27,6 @@ void kmain(void* ptr, uint32_t magic) {
|
||||
gdt_init();
|
||||
// isr_init();
|
||||
// pag_init();
|
||||
while (1);
|
||||
|
||||
debugf("Basic initialization complete!\n");
|
||||
|
||||
|
||||
Reference in New Issue
Block a user