PREEMPTIVE MULTITASKING!!!!

This commit is contained in:
2025-05-06 19:29:35 +02:00
parent a48fa362d0
commit c646404cf0
14 changed files with 215 additions and 103 deletions
+15 -25
View File
@@ -10,14 +10,14 @@ void gdt_reload(void) {
__asm__ volatile (
"cli\n"
"lgdt (%0)\n"
"ljmp $0x08, $1f\n"
"1:\n"
"movw $0x10, %%ax\n"
"movw %%ax, %%ds\n"
"movw %%ax, %%es\n"
"movw %%ax, %%fs\n"
"movw %%ax, %%gs\n"
"movw %%ax, %%ss\n"
"ljmp $0x08, $1f\n"
"1:"
:
: "m" (gdtp)
: "memory", "rax"
@@ -26,38 +26,28 @@ void gdt_reload(void) {
void tss_reload(void) {
__asm__ volatile ("ltr %0" : : "rm"(GDT_TSS));
gdt[5].access |= 0x02;
}
void tss_esp0(uint32_t esp0) { tss.esp0 = esp0; }
int gdt_init(void) {
// Null descriptor (0)
gdt[0] = GDT_DESC(0, 0, 0, 0);
// Kernel code (8)
gdt[1] = GDT_DESC(0xfffff, 0, 0x9a, 0xc);
// Kernel data (16)
gdt[2] = GDT_DESC(0xfffff, 0, 0x92, 0xc);
// User code (24)
gdt[3] = GDT_DESC(0xfffff, 0, 0xfa, 0xc);
// User data (32)
gdt[4] = GDT_DESC(0xfffff, 0, 0xf2, 0xc);
// TSS (40)
memset(&tss, 0, sizeof(tss));
gdt[5] = GDT_DESC(sizeof(tss) - 1, (uint32_t)&tss, 0x89, 0x40);
tss.iopb = sizeof(struct tss_pointer);
tss.esp0 = __kernel_stack_top;
tss.ss0 = GDT_KERNEL_DATA;
// GDT Pointer
gdtp.limit = sizeof(gdt) - 1;
gdtp.base = (uint32_t)&gdt;
// Setup TSS
memset(&tss, 0, sizeof(tss));
tss.ss0 = GDT_KERNEL_DATA;
tss.iopb = sizeof(struct tss_pointer);
// Load descriptors
gdt[0] = GDT_DESC(0, 0, 0, 0); // Null descriptor
gdt[1] = GDT_DESC(0xFFFFFFFF, 0, 0x9A, 0xC0); // Kernel code
gdt[2] = GDT_DESC(0xFFFFFFFF, 0, 0x92, 0xC0); // Kernel data
gdt[3] = GDT_DESC(0xFFFFFFFF, 0, 0xFA, 0xC0); // User code
gdt[4] = GDT_DESC(0xFFFFFFFF, 0, 0xF2, 0xC0); // User data
gdt[5] = GDT_DESC(sizeof(tss) - 1, (uint32_t)&tss, 0x89, 0);
gdt_reload();
tss_reload();