diff --git a/src/kernel/Link.ld b/src/kernel/Link.ld index ed6473f..8898e2c 100644 --- a/src/kernel/Link.ld +++ b/src/kernel/Link.ld @@ -1,10 +1,29 @@ ENTRY(_start) +KERNEL_OFFSET = 0xFFFFFF8000000000; +KERNEL_START = 0x10000; + SECTIONS { - .text : + . = KERNEL_START + KERNEL_OFFSET; + kernel_start = .; + .text : AT(ADDR(.text) - KERNEL_OFFSET) { *(.multiboot) *(.text) } + .rodata : AT(ADDR(.rodata) - KERNEL_OFFSET) + { + *(.rodata*) + } + .data : AT(ADDR(.data) - KERNEL_OFFSET) + { + *(.data) + } + .bss : AT(ADDR(.bss) - KERNEL_OFFSET) + { + *(.COMMON) + *(.bss) + } + kernel_end = .; } \ No newline at end of file diff --git a/src/kernel/Makefile b/src/kernel/Makefile index 58331cb..048dc59 100644 --- a/src/kernel/Makefile +++ b/src/kernel/Makefile @@ -7,7 +7,7 @@ CC := ${TARGET}-gcc SRC := $(wildcard **/*.[cS]) OBJ := $(patsubst %, %.o, $(basename $(SRC))) -CFLAGS := -Wall -Wextra -pedantic -ffreestanding +CFLAGS := -Wall -Wextra -pedantic -ffreestanding -mcmodel=large CFLAGS += -ggdb -O0 ASFLAGS += -ggdb CPPFLAGS += -I include diff --git a/src/kernel/boot/boot.S b/src/kernel/boot/boot.S index 1b7aef2..19f1d4f 100644 --- a/src/kernel/boot/boot.S +++ b/src/kernel/boot/boot.S @@ -17,7 +17,7 @@ _start: cli // Temporary stack for booting - mov esp, offset BootStack + mov esp, offset V2P(BootStack) // Enable Page Address Extension mov eax, cr4 @@ -25,7 +25,7 @@ _start: mov cr4, eax // Load Page Table (defined in boot/boot_PT.S) - mov eax, offset BootP4 + mov eax, offset V2P(BootP4) mov cr3, eax // Enable Long Mode @@ -40,10 +40,10 @@ _start: mov cr0, eax // Load GDT (defined in cpu/gdt.c) - lgdt [GDTp] + lgdt [V2P(GDTp)] // Jump into long mode - jmp 0x8:long_mode_start + jmp 0x8:V2P(long_mode_start) .code64 long_mode_start: @@ -54,4 +54,36 @@ long_mode_start: mov ds, eax mov es, eax + movabs rax, offset upper_memory + jmp rax + +upper_memory: + movabs rax, offset BootStack + mov rsp, rax + + mov rax, 0 + movabs [BootP4], rax + + mov rax, cr3 + mov cr3, rax + + movabs rax, offset GDTp + lgdt [rax] + mov rax, 0 + mov ss, eax + mov ds, eax + mov es, eax + + movabs rax, offset .reload_cs + pushq 0x8 + push rax + retfq + +.reload_cs: + +.extern kmain + movabs rax, offset kmain + call rax + + hlt jmp $ \ No newline at end of file diff --git a/src/kernel/boot/boot_PT.S b/src/kernel/boot/boot_PT.S index d486919..7e4d4f3 100644 --- a/src/kernel/boot/boot_PT.S +++ b/src/kernel/boot/boot_PT.S @@ -6,17 +6,18 @@ .global BootP4 BootP4: - .quad offset BootP3 + (PAGE_PRESENT | PAGE_WRITE) - .rept ENTRIES_PER_PT - 1 + .quad offset V2P(BootP3) + (PAGE_PRESENT | PAGE_WRITE) + .rept ENTRIES_PER_PT - 2 .quad 0 .endr + .quad offset V2P(BootP3) + (PAGE_PRESENT | PAGE_WRITE) BootP3: - .quad offset BootP2 + (PAGE_PRESENT | PAGE_WRITE) + .quad offset V2P(BootP2) + (PAGE_PRESENT | PAGE_WRITE) .rept ENTRIES_PER_PT - 1 .quad 0 .endr BootP2: - .quad offset BootP1 + (PAGE_PRESENT | PAGE_WRITE) + .quad offset V2P(BootP1) + (PAGE_PRESENT | PAGE_WRITE) .rept ENTRIES_PER_PT - 1 .quad 0 .endr diff --git a/src/kernel/boot/kmain.c b/src/kernel/boot/kmain.c new file mode 100644 index 0000000..3506fda --- /dev/null +++ b/src/kernel/boot/kmain.c @@ -0,0 +1,25 @@ +#include + +void clear_screen() +{ + unsigned char *vidmem = P2V(0xB8000); + for(int i=0; i < 80*24*2; i++) + *vidmem++ = 0; +} + +void print_string(char *str) +{ + unsigned char *vidmem = P2V(0xB8000); + while(*str) + { + *vidmem++ = *str++; + *vidmem++ = 0x7; + } +} + +void kmain() +{ + clear_screen(); + print_string("Hello from c, world!"); + for(;;); +} \ No newline at end of file diff --git a/src/kernel/include/memory.h b/src/kernel/include/memory.h index 5beeea1..94a500e 100644 --- a/src/kernel/include/memory.h +++ b/src/kernel/include/memory.h @@ -1,5 +1,16 @@ #pragma once +#define KERNEL_OFFSET 0xFFFFFF8000000000 + +#ifdef __ASSEMBLER__ +#define V2P(a) ((a) - KERNEL_OFFSET) +#define P2V(a) ((a) + KERNEL_OFFSET) +#else +#include +#define V2P(a) ((uintptr_t)(a) &~KERNEL_OFFSET) +#define P2V(a) ((void *)((uintptr_t)(a) | KERNEL_OFFSET)) +#endif + #define PAGE_SIZE 0x1000 #define PAGE_PRESENT 0x001