]> git.ameliathe1st.gay Git - voyage-au-centre-des-fichiers.git/commitdiff
Put the kernel in the upper half.
authorAmelia Coutard <eliottulio.coutard@gmail.com>
Wed, 27 Apr 2022 20:50:15 +0000 (22:50 +0200)
committerAmelia Coutard <eliottulio.coutard@gmail.com>
Wed, 27 Apr 2022 20:50:15 +0000 (22:50 +0200)
linker.ld
src/boot.S
src/kernel.cpp

index 8b2f5d45129f386bc3e69e24cc8601b1b655f014..60de5eb000614e0299dc79d1fd06c2bee8fe5ce0 100644 (file)
--- a/linker.ld
+++ b/linker.ld
@@ -1,6 +1,6 @@
 ENTRY(_start)
 
-KERNEL_VMA = 0; /*0xffffffff80000000;*/
+KERNEL_VMA = 0xFFFFFFFF80000000;
 SECTIONS {
 
        .bootstrap ALIGN(4K) : {
index 455f86a74d7817b26a232ce5b6ee91e2c1a09a27..26a779c1851fd0cb601480129999d757ca55ef84 100644 (file)
@@ -1,6 +1,6 @@
 #include "multiboot2.hpp"
 
-.set KERNEL_VMA, 0# 0xFFFFFFFF80000000
+.set KERNEL_VMA, 0xFFFFFFFF80000000
 
 .section .multiboot_header
 multiboot_header_start:
@@ -48,14 +48,15 @@ GDT:
         .int 0x00CF8900
     GDT.PTR:
         .short . - GDT - 1
-        .quad GDT
+        .quad GDT - KERNEL_VMA
 
 .section .bss
 .align 0x1000
-PML4T: .skip 0x1000
-PDPT:  .skip 0x1000
-PDT:   .skip 0x1000
-PT:    .skip 0x1000
+PML4T:     .skip 0x1000
+PDPT_low:  .skip 0x1000
+PDPT_high: .skip 0x1000
+PDT:       .skip 0x1000
+PT:        .skip 0x1000
 .align 16
 stack_bottom:
 .skip 1024 * 16 # 16KiB
@@ -65,7 +66,7 @@ stack_top:
 .code32
 .globl _start
 _start:
-       mov $stack_top, %esp
+       mov $stack_top - KERNEL_VMA, %esp
 
        # Check if cpuid is supported:
        pushfl
@@ -128,16 +129,19 @@ _start:
        mov %eax, %cr0
 
        # Setup 64-bit paging:
-       mov $PML4T, %eax
+       mov $PML4T - KERNEL_VMA, %eax
        mov %eax, %cr3
-       mov $PDPT + 3, %eax
-       mov %eax, PML4T + 0 * 8
-       mov $PDT + 3, %eax
-       mov %eax, PDPT  + 0 * 8
-       mov $PT + 3, %eax
-       mov %eax, PDT   + 0 * 8
+       mov $PDPT_low - KERNEL_VMA + 3, %eax
+       mov %eax, PML4T - KERNEL_VMA + 0 * 8
+       mov $PDPT_high - KERNEL_VMA + 3, %eax
+       mov %eax, PML4T - KERNEL_VMA + 511 * 8
+       mov $PDT - KERNEL_VMA + 3, %eax
+       mov %eax, PDPT_low - KERNEL_VMA + 0 * 8
+       mov %eax, PDPT_high - KERNEL_VMA + 510 * 8
+       mov $PT - KERNEL_VMA + 3, %eax
+       mov %eax, PDT - KERNEL_VMA + 0 * 8
 
-       mov $PT, %edi
+       mov $PT - KERNEL_VMA, %edi
        mov $0x0003, %ebx
        mov $512, %ecx
 1:     mov %ebx, (%edi)
@@ -161,7 +165,7 @@ _start:
        mov %eax, %cr0
 
        # Jump to 64 bits:
-       lgdt (GDT.PTR)
+       lgdt (GDT.PTR - KERNEL_VMA)
        jmp $GDT.CODE, $.trampoline
 
 .code64
@@ -176,11 +180,6 @@ _start:
        mov $.higher_half, %rax
        jmp *%rax
 
+.section .text
 .higher_half:
-       movw $0x024F, 0xB8000
-       movw $0x026B, 0xB8002
-       movw $0x022E, 0xB8004
        call kmain
-       cli
-1:     hlt
-       jmp 1b
index d3132d7d568b737dde4ebf5715db8cb57ed1dff3..e7d9d6aeb9cec3e21d1296ed5c85de8461f4034a 100644 (file)
@@ -1,8 +1,7 @@
 #include "multiboot2.hpp"
 
 extern "C" void kmain() {
-       // volatile short* vga_text = reinterpret_cast<volatile short*>((void*)0xFFFFFFFF800B8000);
-       volatile short* vga_text = reinterpret_cast<volatile short*>((void*)0xB8000);
+       volatile short* vga_text = reinterpret_cast<volatile short*>((void*)0xFFFFFFFF800B8000);
        const char* str = "Success ! Took me long enough.";
        for (unsigned long i = 0; str[i] != '\0'; i++) {
                vga_text[i] = (0x02 << 8) + str[i];