From e6bec1afcd1c351c13db821a4bb5e899a6c37901 Mon Sep 17 00:00:00 2001 From: Tyler Murphy <=> Date: Mon, 17 Jul 2023 00:09:26 -0400 Subject: [PATCH] paging --- kernel/linker.ld | 37 +++++++++------ kernel/src/boot/tag.c | 6 --- kernel/src/cpu/cpu.c | 24 +++++----- kernel/src/cpu/cpu.h | 7 ++- kernel/src/drivers/ps2ctrl.c | 10 +--- kernel/src/drivers/ps2kb.c | 10 ++-- kernel/src/drivers/ps2mouse.c | 8 +--- kernel/src/main.c | 16 +++++-- kernel/src/print/panic.c | 2 +- kernel/src/start.asm | 88 +++++++++++++++++++++++++++++------ kernel/src/tty/term.c | 2 +- 11 files changed, 134 insertions(+), 76 deletions(-) diff --git a/kernel/linker.ld b/kernel/linker.ld index beb44df..541975e 100644 --- a/kernel/linker.ld +++ b/kernel/linker.ld @@ -1,31 +1,40 @@ ENTRY(start) SECTIONS { - . = 1M; + + . = 0x00100000; kernel_start = .; + + .multiboot.data : { + *(.multiboot.data) + } + + .multiboot.text : { + *(.multiboot.text) + } + + . += 0xC0000000; - .boot BLOCK(4K) : ALIGN(4K) - { - *(.multiboot) - } - - .text BLOCK(4K) : ALIGN(4K) + .text ALIGN (4K) : AT (ADDR (.text) - 0xC0000000) { *(.text) } - - .rodata BLOCK(4K) : ALIGN(4K) + .rodata ALIGN (4K) : AT (ADDR (.rodata) - 0xC0000000) { *(.rodata) } - - - .bss BLOCK(4K) : ALIGN(4K) + .data ALIGN (4K) : AT (ADDR (.data) - 0xC0000000) { - *(.bss) + *(.data) } - + .bss ALIGN (4K) : AT (ADDR (.bss) - 0xC0000000) + { + *(COMMON) + *(.bss) + *(.bootstrap_stack) + } + kernel_end = .; } diff --git a/kernel/src/boot/tag.c b/kernel/src/boot/tag.c index d4dd0c9..a344d72 100644 --- a/kernel/src/boot/tag.c +++ b/kernel/src/boot/tag.c @@ -9,7 +9,6 @@ static struct BootInfo info; static void read_cmdline(struct BootTag *tag, char *data, uint8_t len) { - debugk("Found cmdline"); if (len >= CMDLINE_MAX) panic("multiboot2 cmd line to long\nmax is %d but was provided %d\n", CMDLINE_MAX, len); @@ -18,13 +17,11 @@ static void read_cmdline(struct BootTag *tag, char *data, uint8_t len) { } static void read_memorymap(struct BootTag *tag, uint32_t *data) { - debugk("Found memorymap"); tag->data.memory_map = (struct MemoryMap *) data; info.tags[iD_MEMORYMAP] = *tag; } static void read_rsdp(struct BootTag *tag, char *data) { - debugk("Found RSDP"); tag->data.rsdp = (struct RootSystemDescriptionPointer *) data; info.tags[ID_RSDP] = *tag; } @@ -60,8 +57,6 @@ static uint32_t *read_tag(uint32_t *data) { void load_boot_info(void* boot_info) { - debugk("Reading multiboot info"); - memset(&info, 0, sizeof(boot_info)); uint32_t* data = (uint32_t*) boot_info; @@ -72,7 +67,6 @@ void load_boot_info(void* boot_info) { data = read_tag(data); } - succek("Loaded multiboot info"); } bool get_boot_tag(enum BootTagID id, struct BootTag **tag) { diff --git a/kernel/src/cpu/cpu.c b/kernel/src/cpu/cpu.c index f78ef26..416a1ad 100644 --- a/kernel/src/cpu/cpu.c +++ b/kernel/src/cpu/cpu.c @@ -2,19 +2,17 @@ #include "print.h" -extern int sse_init (void); -extern int fpu_init (void); +extern uint8_t sse_init (void); +extern uint8_t fpu_init (void); -void init_registers (void) { - if (!sse_init()) { - debugk("Loaded SIMD"); - } else { - errork("SIMD not supported"); - } +uint8_t init_registers (uint8_t reg) { + uint8_t res = 0; - if (!fpu_init()) { - debugk("Loaded FPU"); - } else { - errork("FPU not supported"); - } + if (reg & SSE_REG) + res |= ~sse_init() & SSE_REG; + + if (reg & FPU_REG) + res |= ~fpu_init() & FPU_REG; + + return res; } diff --git a/kernel/src/cpu/cpu.h b/kernel/src/cpu/cpu.h index 3044292..b6221aa 100644 --- a/kernel/src/cpu/cpu.h +++ b/kernel/src/cpu/cpu.h @@ -1,3 +1,8 @@ #pragma once -void init_registers (void); +#include + +#define SSE_REG 0x01 +#define FPU_REG 0x02 + +uint8_t init_registers (uint8_t reg); diff --git a/kernel/src/drivers/ps2ctrl.c b/kernel/src/drivers/ps2ctrl.c index 527435d..05ef25d 100644 --- a/kernel/src/drivers/ps2ctrl.c +++ b/kernel/src/drivers/ps2ctrl.c @@ -48,8 +48,6 @@ void ps2ctrl_set_port2(void) { void ps2ctrl_init(void) { - debugk("Loading PS/2 Controller"); - is_init = false; pic_mask(1); // keyboard @@ -61,8 +59,7 @@ void ps2ctrl_init(void) { ps2ctrl_out_cmd(0xAA); uint8_t response = ps2ctrl_in(); if(response != 0x55) { - errork("PS/2 controller failed to initialize"); - return; + panic("PS/2 controller failed to initialize"); } // set config @@ -80,8 +77,7 @@ void ps2ctrl_init(void) { ps2ctrl_out_cmd(0xA9); response = ps2ctrl_in(); if (response == 0x01) { - errork("PS/2 port 2 not supported"); - return; + panic("PS/2 port 2 not supported"); } ps2ctrl_out_cmd(0xA8); @@ -90,8 +86,6 @@ void ps2ctrl_init(void) { pic_unmask(1); pic_unmask(12); - - succek("Loaded PS/2 Controller"); } bool ps2ctrl_is_init(void) { diff --git a/kernel/src/drivers/ps2kb.c b/kernel/src/drivers/ps2kb.c index dec0b87..f6fc514 100644 --- a/kernel/src/drivers/ps2kb.c +++ b/kernel/src/drivers/ps2kb.c @@ -59,8 +59,6 @@ static bool state_ext = false; void ps2kb_init(void) { - debugk("Loading PS/2 Keyboard"); - is_init = false; pic_mask(1); @@ -69,24 +67,22 @@ void ps2kb_init(void) { ps2ctrl_out_data(0xFF); result = ps2ctrl_in(); if(result != 0xFA) { - errork("Failed to reset PS/2 keyboard: expected 0xFA, got 0x%X\n", result); + panic("Failed to reset PS/2 keyboard: expected 0xFA, got 0x%X\n", result); return; } result = ps2ctrl_in(); if(result != 0xAA) { - errork("Failed to reset PS/2 keyboard: expected 0xAA, got 0x%X\n", result); + panic("Failed to reset PS/2 keyboard: expected 0xAA, got 0x%X\n", result); return; } ps2ctrl_out_data(0xF4); result = ps2ctrl_in(); if(result != 0xFA) { - errork("Failed to enable PS/2 keyboard: expected 0xFA, got 0x%X\n", result); + panic("Failed to enable PS/2 keyboard: expected 0xFA, got 0x%X\n", result); return; } - succek("PS/2 Keyboard has has been loaded"); - pic_unmask(1); is_init = true; } diff --git a/kernel/src/drivers/ps2mouse.c b/kernel/src/drivers/ps2mouse.c index 01e10cc..1616cd6 100644 --- a/kernel/src/drivers/ps2mouse.c +++ b/kernel/src/drivers/ps2mouse.c @@ -15,8 +15,6 @@ static uint8_t first_b, second_b, third_b; void ps2mouse_init(void) { - debugk("Loading PS/2 Mouse"); - is_init = false; pic_mask(12); @@ -26,12 +24,12 @@ void ps2mouse_init(void) { ps2ctrl_out_data(0xFF); result = ps2ctrl_in(); if (result != 0xFA) { - errork("Failed to reset PS/2 mouse: expected 0xFA, got 0x%X", result); + panic("Failed to reset PS/2 mouse: expected 0xFA, got 0x%X", result); return; } result = ps2ctrl_in(); if (result != 0xAA) { - errork("Failed to reset PS/2 mouse: expected 0xAA, got 0x%X", result); + panic("Failed to reset PS/2 mouse: expected 0xAA, got 0x%X", result); return; } @@ -40,8 +38,6 @@ void ps2mouse_init(void) { pic_unmask(12); is_init = true; - - succek("PS/2 Mouse has has been loaded"); } static uint8_t packet_num = 0; diff --git a/kernel/src/main.c b/kernel/src/main.c index 7c0f221..da5879a 100644 --- a/kernel/src/main.c +++ b/kernel/src/main.c @@ -12,12 +12,18 @@ #include #include +#include #include #include static double x = 0, y = 0; -void kernel_main(void* boot_info) { +void kernel_boot(void *boot_info) { + (void)boot_info; +} + + +void kernel_main(void) { term_init(); cursor_enable(); @@ -28,16 +34,16 @@ void kernel_main(void* boot_info) { idt_init(); pic_remap(PIC_REMAP_OFFSET); - load_boot_info(boot_info); - acpi_init(); + // load_boot_info(boot_info); + // acpi_init(); - memory_init(); + // memory_init(); ps2ctrl_init(); ps2kb_init(); ps2mouse_init(); - init_registers(); + init_registers(FPU_REG | SSE_REG); while(1) { int_wait(); diff --git a/kernel/src/print/panic.c b/kernel/src/print/panic.c index 5e686e1..58ffe40 100644 --- a/kernel/src/print/panic.c +++ b/kernel/src/print/panic.c @@ -20,7 +20,7 @@ void _panic_impl(char* msg, int line, char* file, ...) { vprintk(msg, args); if (!term_newline()) putchar('\n'); printk("\nin %s at line %d\n", file, line); - + term_flush(); while(1) { halt(); } diff --git a/kernel/src/start.asm b/kernel/src/start.asm index 95f4a05..c01cbaa 100644 --- a/kernel/src/start.asm +++ b/kernel/src/start.asm @@ -1,6 +1,8 @@ global start -global heap_start +extern kernel_boot extern kernel_main +extern kernel_start +extern kernel_end bits 32 ; base, limit, access, flags @@ -16,14 +18,18 @@ bits 32 %endmacro MAGIC equ 0xe85250d6 +FLAGS equ 0 LENGTH equ mb_end - mb_start CHECKSUM equ -(MAGIC + LENGTH) - -section .multiboot + +VGABUF equ 0x000B8000 +KRNMAP equ 0xC0000000 + +section .multiboot.data align 8 mb_start: dd MAGIC -dd 0 +dd FLAGS dd LENGTH dd CHECKSUM dw 0 @@ -31,12 +37,6 @@ dw 0 dd 8 mb_end: -section .bss -align 16 -stack_end: -resb 16384 -stack_top: - section .rodata align 16 gdt_start: @@ -48,16 +48,77 @@ gdt_descriptor: dw gdt_end - gdt_start - 1 dd gdt_start -section .text +section .bootstrap_stack +align 16 +stack_start: +resb 16384 ; 16 KiB +stack_end: + +section .bss +align 4096 +page_directory: +resb 4096 +page_table1: +resb 4096 + +section .multiboot.text align 8 start: + + ; push ebx + ; call kernel_boot + ; pop eax + + mov edi, page_table1 - KRNMAP + mov esi, 0 + mov ecx, 1023 + +paging_cmp: + cmp esi, kernel_start + jl paging_add + cmp esi, kernel_end - KRNMAP + jge paging_map + + mov edx, esi + or edx, 0x003 + mov [edi], edx + +paging_add: + add esi, 4096 + add edi, 4 + loop paging_cmp + +paging_map: + mov dword [page_table1 - KRNMAP + 1023 * 4], VGABUF | 0x003 + mov dword [page_directory - KRNMAP + 0], page_table1 - KRNMAP + 0x003 + mov dword [page_directory - KRNMAP + 768 * 4], page_table1 - KRNMAP + 0x003 + + mov ecx, page_directory - KRNMAP + mov cr3, ecx + + mov ecx, cr0 + or ecx, 0x80010000 + mov cr0, ecx + + lea ecx, load_gdt + jmp near ecx + +section .text +align 8 +load_gdt: cli lgdt [gdt_descriptor] mov eax, cr0 or al, 1 mov cr0, eax - jmp 0x08:after_lgdt -after_lgdt: + jmp 0x08:load_kernel + +load_kernel: + + mov dword [page_directory], 0 + mov ecx, cr3 + mov cr3, ecx + mov ax, 0x10 mov ds, ax mov ss, ax @@ -67,7 +128,6 @@ after_lgdt: mov esp, stack_end mov ebp, stack_end sti - push ebx call kernel_main cli halt: diff --git a/kernel/src/tty/term.c b/kernel/src/tty/term.c index 231d38b..a7451d2 100644 --- a/kernel/src/tty/term.c +++ b/kernel/src/tty/term.c @@ -28,7 +28,7 @@ static void term_clear_line(int y) { void term_init (void) { x = 0; y = 0; - front = (uint16_t*) 0xb8000; + front = (uint16_t*) 0xC03FF000; term_setfg(VGA_WHITE); term_setbg(VGA_BLACK); term_clear();