diff --git a/boot/loader/loader.asm b/boot/loader/loader.asm index 09b565b..586d18e 100644 --- a/boot/loader/loader.asm +++ b/boot/loader/loader.asm @@ -38,7 +38,7 @@ _start: mov es, ax ; And es because it is jealous ;mov [Bootdrv], dl xor dl, dl - jmp 0x0000:_loader ; pas sûr + jmp 0x0000:main ; pas sûr ;; Magnificent multiboot header for GRUB ------------------------------------ ;; MB_header: @@ -60,7 +60,7 @@ MB_start: push eax ; 2nd argument is magic number push ebx ; 1st argument multiboot info pointer mov ecx, eax - call _loader + call main add esp, 8 ; Cleanup arguments "A la MIPS" jmp Die ; Aufwiedersehen @@ -79,39 +79,42 @@ Die: jmp $ ;; THE CODE ----------------------------------------------------------------- ;; - -; ---------------------------------------------------------------------------- ; -; _loader ; -; ; -; This is the function that initiates the launch of OS/K. It verifies that ; -; Grub has properly loaded this loader and makes the appropriate setup so ; -; that the kernel will work properly ; -; ; -; Why this original design ? Because it works well and prevent us to cause ; -; triple faults by aligment error or too long jumps (yup, it can be a problem); -; ; -; ---------------------------------------------------------------------------- ; -_loader: - jmp lbegin - -%include "boot/loader/multiboot/check.inc" -lbegin: +main: call MB_check - jmp lnext -%include "boot/loader/cpu/cpuid.inc" -lnext: call Check_cpuid call Is64Bits - jmp lnext2 -%include "boot/loader/mem/structures.inc" -lnext2: call Setup_paging - jmp lnext3 -%include "boot/loader/mem/management.inc" -lnext3: + ;; Registering paging + mov eax, PML4_table + mov cr3, eax ; Load PML4 to cr3 + + mov eax, cr4 + or eax, 1 << 5 + mov cr4, eax ; Enable PAE + + ;; Activate long mode + mov ecx, 0xC0000080 ; address of MSR + rdmsr ; read MSR + or eax, 1 << 8 ; LME = 1. (Long Mode Enable) + wrmsr ; write MSR + + ;; Enable paging + mov eax, cr0 + or eax, 1 << 31 ; make MSR bit 31 (PG = Paging) to 1 : + ; |1|000000000000000000000000000000 + ; | + ; `------ Paging bit + mov cr0, eax + mov dword [0xb8000], 0x2f4b2f4f ret +;; INCLUDES ----------------------------------------------------------------- ;; +%include "boot/loader/cpu/cpuid.inc" +%include "boot/loader/multiboot/check.inc" +%include "boot/loader/mem/structures.inc" +%include "boot/loader/mem/management.inc" + diff --git a/boot/loader/mem/management.inc b/boot/loader/mem/management.inc index 3634666..3790a9d 100644 --- a/boot/loader/mem/management.inc +++ b/boot/loader/mem/management.inc @@ -52,31 +52,3 @@ Setup_paging: jne .map_p2_table ; else map the next entry ret - -; ---------------------------------------------------------------------------- ; -; Enable long mode and paging ; -; ---------------------------------------------------------------------------- ; -Go64: - ;; Registering paging - mov eax, PML4_table - mov cr3, eax ; Load PML4 to cr3 - - mov eax, cr4 - or eax, 1 << 5 - mov cr4, eax ; Enable PAE - - ;; Activate long mode - mov ecx, 0xC0000080 ; address of MSR - rdmsr ; read MSR - or eax, 1 << 8 ; LME = 1. (Long Mode Enable) - wrmsr ; write MSR - - ;; Enable paging - mov eax, cr0 - or eax, 1 << 31 ; make MSR bit 31 (PG = Paging) to 1 : - ; |1|000000000000000000000000000000 - ; | - ; `------ Paging bit - mov cr0, eax - - ret diff --git a/build/obj/boot/loader.bin b/build/obj/boot/loader.bin index faf3109..182a3e2 100644 Binary files a/build/obj/boot/loader.bin and b/build/obj/boot/loader.bin differ