45 lines
1.1 KiB
ArmAsm
Raw Normal View History

#include "cpu/memlayout.h"
/*
Memory layout at this point (see https://wiki.osdev.org/Memory_Map_(x86) for more details):
0x00500 - 0x08fff: usable memory
0x09000 0x14fff: kernel code and global data
0x15000 - 0x7ffff: usable memory
0x80000 - 0xfffff: BDA and upper memory
0x100000 - 0x8000000 (1 MiB - 128 MiB): usable memory
*/
.intel_syntax noprefix
.global _start
.asciz "kernel start\n"
_start:
// zero out PD at 0x1000
xor eax, eax
mov ecx, 1024
rep stosd
2025-01-17 23:29:01 +04:00
// Enable 4 MiB pages
mov eax, cr4
or eax, 0x10 // Set the PSE bit (bit 4)
mov cr4, eax
// Identity map low 4 MiB
2026-04-06 05:20:00 +03:00
mov dword ptr [0x1000], 0 | PTE_P | PTE_W | PDE_PS
// KERNBASE = 0x8000_0000
// Same mapping for the first 4 MiB after KERNBASE
2026-04-06 05:20:00 +03:00
mov dword ptr [0x1000 + ((KERNBASE >> 22) * 4)], 0 | PTE_P | PTE_W | PDE_PS
// Load physical address of PD into CR3
mov edi, 0x1000
mov cr3, edi
// Enable paging
mov eax, cr0
or eax, 1 << 31 // Set the PG bit
mov cr0, eax
// jump to the high half
add esp, KERNBASE
lea eax, kmain
jmp eax