6.常見暫存器和指令

INnoVation-V2發表於2024-04-21

一.暫存器

1.通用暫存器

image-20221017175611669

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將推遲裝置中斷,直到核心重新設定SIESPP位指示trap是來自使用者模式還是管理模式,並控制sret返回的模式。

2.1 mstatus暫存器

image-20221018111341690
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指令由pmpcfgXpmpaddrX組成,以riscv32為例,一共有16個pmpcfgpmpaddrX,其中pmpcfg是4個表項佔用一個暫存器,每個pmpaddr單獨佔用一個暫存器,又因為RV32擁有34位實體地址空間,而暫存器只有32位,所以只儲存\([2,33]\)位,低2位不儲存

image-20221018120003913

二.指令

  1. csrr,讀取一個 CSR 的值到通用暫存器。如:csrr t0, mstatus,讀取 mstatus 的值到 t0 中。
  2. csrw,把一個通用暫存器中的值寫入 CSR 中。如:csrw mstatus, t0,將 t0 的值寫入 mstatus
  3. csrs,把 CSR 中指定的 bit 置 1。如:csrsi mstatus, (1 << 2),將 mstatus 的右起第 3 位置 1。
  4. csrc,把 CSR 中指定的 bit 置 0。如:csrci mstatus, (1 << 2),將 mstatus 的右起第 3 位置 0。
  5. csrrw,讀取一個 CSR 的值到通用暫存器,然後把另一個值寫入該 CSR。如:csrrw t0, mstatus, t0,將 mstatus 的值與 t0 的值交換。
  6. csrrs,讀取一個 CSR 的值到通用暫存器,然後把該 CSR 中指定的 bit 置 1。
  7. csrrc,讀取一個 CSR 的值到通用暫存器,然後把該 CSR 中指定的 bit 置 0。
  8. sfence.vma

相關文章