Map the kernel into the virtual memory

This commit is contained in:
2025-07-06 23:37:56 +02:00
parent ff02f911cd
commit 634673678a
2 changed files with 27 additions and 18 deletions

View File

@@ -4,6 +4,7 @@ ENTRY(boot)
SECTIONS {
. = 0x80200000;
__kernel_base = .;
.text :{
KEEP(*(.text.boot));
@@ -30,6 +31,4 @@ SECTIONS {
. = ALIGN(4096);
__free_ram = .;
. += 64 * 1024 * 1024; /* 64MB */
__free_ram_end = .;
}

View File

@@ -34,24 +34,34 @@ kernel_main:
call device_tree
# Prepare the kernel root memory table.
la a0, __kernel_base
srli a0, a0, 22
andi a0, a0, 0x3ff # VPN[1].
# Multiply VPN[1] by 4 and add to the start address of the page table.
# This gives the physical address of the page table entry.
la t0, __free_ram
slli a0, a0, 2
add a0, t0, a0
# Calculate PPN[1] (10 most significant bits of the physical address
# and map it to 12 bits of the table page entry.
la a1, __kernel_base
srli a1, a1, 2
li t0, 0xff300000
and a1, a1, t0
ori a1, a1, 0b1111
sw a1, (a0) # Save the page entry.
la a0, __free_ram
li a1, 8
call write_x
la t0, __free_ram
srli t0, t0, 10
li t1, 0xf0000000
or t0, t0, t1
la t1, __free_ram
sw t0, (t1)
la t0, __free_ram
ori t0, t0, 1
csrw satp, t0
sfence.vma zero, zero
srli a0, a0, 12
li t0, 0x80000000
or a0, a0, t0
sfence.vma
csrw satp, a0
sfence.vma
# Do nothing in a loop.
.Lkernel_main: