mirror of
https://github.com/Tom-on64/kern.git
synced 2026-11-04 02:23:10 +00:00
PREEMPTIVE MULTITASKING!!!!
This commit is contained in:
+15
-25
@@ -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();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user