Příklad na nastavení stránkovací tabulky. Na virtuální adresu 0x6000 mapovaná fyzická stránka začínající na 0x1000 a data z ní jsou poté kopírovaná na virtuální adresu 0x7000, která se překládá do stránky začínající na 0x2000.
.text
.globl _start
.equ PAGE_SIZE 4096
.equ ATTR 0x0CF
.equ PTE_V 1
# PTE_V = 0x001
# PTE_R = 0x002
# PTE_W = 0x004
# PTE_X = 0x008
# PTE_A = 0x040
# PTE_D = 0x080
# -------------------------------------------------
# start v M-mode
# -------------------------------------------------
_start:
# nastavit reakci navypadek stranky, vyjimky a preruseni
li t0, m_fault
csrw mtvec, t0
li t0, s_fault
csrw stvec, t0
# vytvořit mapování
la a0, _start
addi a1, a0, 0
call map_page
li a0, 0x6000
la a1, source_page
call map_page
li a0, 0x7000
la a1, target_page
call map_page
# nastavit satp (Sv32)
la t0, l1_table
srli t0, t0, 12
li t1, 0x80000000
or t0, t0, t1
csrw satp, t0
fence
# připravit přechod do S-mode
la t0, s_mode_start
csrw mepc, t0
csrr t1, mstatus
li t2, 0xffffe700 # ~(3 << 11) # clear MPP
and t1, t1, t2
li t2, 0x800 # (1 << 11) # MPP = S
or t1, t1, t2
li t2, 0x40000 # (1 << 18) # SUM = 1
or t1, t1, t2 # povolení přístupu systému
# do uživatelských stránek
csrw mstatus, t1
mret
# -------------------------------------------------
# map_page(a0 = virtuální adresa, a1 = fyzicka adresa)
# -------------------------------------------------
map_page:
mv t0, a0
# VPN1
srli t1, t0, 22
andi t1, t1, 0x3ff
slli t1, t1, 2
la t2, l1_table
add t3, t2, t1
# pokud L1 prázdná → vložit L0
lw t4, 0(t3)
bnez t4, l1_ok
la t5, l0_table
srli t5, t5, 12
slli t5, t5, 10
ori t5, t5, 0X11
sw t5, 0(t3)
l1_ok:
# VPN0
srli t1, t0, 12
andi t1, t1, 0x3ff
slli t1, t1, 2
la t2, l0_table
add t3, t2, t1
# leaf PTE
srli t4, a1, 12
slli t4, t4, 10
li t5, 0x1f # nastavení vlastností PTE
or t4, t4, t5 # D = 0, A = 0, G = 0, U = 1
# X = 1, W = 1, R = 1, V = 1
sw t4, 0(t3)
ret
# -------------------------------------------------
# obsluha chyby strankovani, vyjimek a preruseni
# -------------------------------------------------
m_fault:
j m_fault
s_fault:
j s_fault
# -------------------------------------------------
# kód v S-mode
# -------------------------------------------------
s_mode_start:
li t0, 0x6000
li t1, 0x7000
li t2, 1024
copy_loop:
lw t3, 0(t0) # read, page 6 set A to 1
lw t4, 0(t1) # dummy, page 7 set A to 1
sw t3, 0(t1) # write, page 7 set D to 1
addi t0, t0, 4
addi t1, t1, 4
addi t2, t2, -1
bnez t2, copy_loop
hang:
j hang
#-------------------------------------------------
# Data
#-------------------------------------------------
.data
.org 0x1000
source_page:
.word 0x12345678, 1,2,3,4,5,6,7, 8, 9, 10, 11, 12 ,13, 14, 15
.word 0,1,2,3,4,5,6,7, 8, 9, 10, 11, 12 ,13, 14, 15
.word 0,1,2,3,4,5,6,7, 8, 9, 10, 11, 12 ,13, 14, 15
.word 0,1,2,3,4,5,6,7, 8, 9, 10, 11, 12 ,13, 14, 15
.word 0,1,2,3,4,5,6,7, 8, 9, 10, 11, 12 ,13, 14, 15
.word 0,1,2,3,4,5,6,7, 8, 9, 10, 11, 12 ,13, 14, 15
.word 0,1,2,3,4,5,6,7, 8, 9, 10, 11, 12 ,13, 14, 15
.word 0,1,2,3,4,5,6,7, 8, 9, 10, 11, 12 ,13, 14, 15
.org 0x2000
target_page:
.word 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
.word 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
.word 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
.word 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
.word 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
.word 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
.word 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
.word 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
#-------------------------------------------------
# Page table
#-------------------------------------------------
.org 0x3000
l1_table:
.word 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
.org 0x4000
l0_table:
.word 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0