10. Virtualizace paměti - stránkování

Další materiály

.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:

# 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

    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, 1

    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, 0xcf
    or t4, t4, t5

    sw t4, 0(t3)

    ret




# -------------------------------------------------
# kód v S-mode
# -------------------------------------------------

s_mode_start:

    li t0, 0x6000
    li t1, 0x7000
    li t2, 1024

copy_loop:

    lw t3, 0(t0)
    sw t3, 0(t1)

    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

courses/b35apo/lectures/10/start.txt · Last modified: 2026/05/05 16:19 by stepan