一.暫存器
1.通用暫存器
2.特殊暫存器
stvec(Supervisor Trap Vector) |
核心在這裡寫入trap處理程式的地址;RISC-V會跳轉到stvec 中的地址來處理trap,xv6的stvec就是trampoline page的起始地址 |
---|---|
sepc | 發生trap時,RISC-V將當前的pc 值儲存到這裡(pc 隨後會被stvec 中的值覆蓋)。從trap返回時,sret 指令會將sepc 複製回pc 。核心可以透過寫入sepc 來控制sret 的去向。 |
scause | RISC-V在這裡放置一個數字,描述產生trap的原因 |
sscratch | trap handler剛開始執行時,沒有可用通用暫存器供使用,sscratch 可作為臨時儲存器來儲存某一通用暫存器的值,以提供一個可用暫存器 |
sstatus | sstatus中的SIE 位控制裝置中斷是否啟用。如果核心清空SIE ,RISC-V將推遲裝置中斷,直到核心重新設定SIE 。SPP 位指示trap 是來自使用者模式還是管理模式,並控制sret 返回的模式。 |
2.1 mstatus暫存器
SIE: 監管者模式(supervisor mode)的全域性中斷使能位。
MIE: 機器模式(machine mode)的全域性中斷使能位。
SPIE:用於儲存進入異常之前,SIE的值。
MPIE:用於儲存進入異常之前,MIE的值。
SPP:用於儲存進入異常之前,處理器處於那種模式。(只有一位,只能用於儲存 S-mode 或者 U-mode 模式)
MPP:用於儲存進入異常之前,處理器處於那種模式。(有兩位, U-mode,S-mode,M-mode 都可以儲存)
FS:用於維護或者反映浮點單元狀態的位域。這個位域可以用於作業系統上下文切換時對浮點狀態的判斷。
XS:用於維護或者反映使用者自定義擴充套件指令單元的狀態。這個位域可以用於作業系統上下文切換時對使用者自定義擴充套件指令單元狀態的判斷。
SD: 用於反映FS或者XS的位域是否處於髒(dirty)狀態。這個位域是 FS,XS 狀態的彙總,方便作業系統上下文切換時快速判斷(即:是否需要對浮點上下文或者其他擴充套件指令狀態進行儲存)。
2.2 medeleg&mideleg
-
medeleg(machine exception delegation Registers):機器異常委託暫存器
-
mideleg(machine interrupt delegation Registers): 機器中斷委託暫存器
預設情況下,任何特權級別的所有陷阱都會在機器模式下處理,當然機器模式處理程式可以使用 MRET 指令將陷阱重定向回適當的模式級別。但是為了提高效能,RISC-V 提供了一種硬體機制,那就是異常中斷委託機制。有了這個機制後,就不再需要軟體程式上使用 MRET 指令將陷阱重定向回想要的模式級別。
2.3 PMP指令
為了安全或其他原因,需要限制可訪問的記憶體範圍,就可以透過PMP指令做到
PMP指令由pmpcfgX
和pmpaddrX
組成,以riscv32為例,一共有16個pmpcfg
和pmpaddrX
,其中pmpcfg
是4個表項佔用一個暫存器,每個pmpaddr
單獨佔用一個暫存器,又因為RV32擁有34位實體地址空間,而暫存器只有32位,所以只儲存\([2,33]\)位,低2位不儲存
二.指令
csrr
,讀取一個 CSR 的值到通用暫存器。如:csrr t0, mstatus
,讀取mstatus
的值到t0
中。csrw
,把一個通用暫存器中的值寫入 CSR 中。如:csrw mstatus, t0
,將t0
的值寫入mstatus
。csrs
,把 CSR 中指定的 bit 置 1。如:csrsi mstatus, (1 << 2)
,將mstatus
的右起第 3 位置 1。csrc
,把 CSR 中指定的 bit 置 0。如:csrci mstatus, (1 << 2)
,將mstatus
的右起第 3 位置 0。csrrw
,讀取一個 CSR 的值到通用暫存器,然後把另一個值寫入該 CSR。如:csrrw t0, mstatus, t0
,將mstatus
的值與t0
的值交換。csrrs
,讀取一個 CSR 的值到通用暫存器,然後把該 CSR 中指定的 bit 置 1。csrrc
,讀取一個 CSR 的值到通用暫存器,然後把該 CSR 中指定的 bit 置 0。sfence.vma