mirror of
https://github.com/Fennix-Project/Kernel.git
synced 2025-05-28 15:34:33 +00:00
71 lines
1.1 KiB
NASM
71 lines
1.1 KiB
NASM
; https://wiki.osdev.org/Creating_a_64-bit_kernel
|
|
; https://wiki.osdev.org/Entering_Long_Mode_Directly
|
|
|
|
KERNEL_VIRTUAL_BASE equ 0xFFFFFFFF80000000 ; 512GB
|
|
KERNEL_LMA equ 0x1000000 ; 16MB
|
|
KERNEL_STACK_SIZE equ 0x4000 ; 16KB
|
|
|
|
extern Multiboot2Entry
|
|
extern BootPageTable
|
|
extern DetectCPUID
|
|
extern Detect64Bit
|
|
global MB2_start
|
|
|
|
[bits 32]
|
|
section .text
|
|
MB2_start:
|
|
cli
|
|
|
|
mov word [0xb8F00], 0x072E ; .
|
|
|
|
call DetectCPUID
|
|
call Detect64Bit
|
|
|
|
mov ecx, cr4
|
|
or ecx, 0x00000010 ; Set PSE in CR4
|
|
mov cr4, ecx
|
|
|
|
mov word [0xb8F02], 0x072E ; .
|
|
|
|
mov ecx, (BootPageTable - KERNEL_VIRTUAL_BASE)
|
|
mov cr3, ecx
|
|
|
|
mov ecx, cr0
|
|
or ecx, 0x80000000 ; Set PG in CR0
|
|
mov cr0, ecx
|
|
|
|
cli
|
|
hlt
|
|
|
|
mov word [0xb8F04], 0x072E ; .
|
|
|
|
|
|
mov word [0xb8F06], 0x072E ; .
|
|
|
|
cli
|
|
hlt
|
|
|
|
; lea ecx, [HigherHalfStart]
|
|
; jmp ecx
|
|
|
|
[bits 64]
|
|
HigherHalfStart:
|
|
mov word [0xb8F08], 0x072E ; .
|
|
mov dword [BootPageTable], 0
|
|
invlpg [0]
|
|
|
|
mov rsp, KernelStack + KERNEL_STACK_SIZE
|
|
|
|
push rax ; Multiboot2 Magic
|
|
add rbx, KERNEL_VIRTUAL_BASE
|
|
push rbx ; Multiboot2 Header
|
|
call Multiboot2Entry
|
|
Loop:
|
|
hlt
|
|
jmp Loop
|
|
|
|
section .bss
|
|
align 16
|
|
KernelStack:
|
|
resb KERNEL_STACK_SIZE
|