mirror of
https://github.com/cccriscv/mini-riscv-os.git
synced 2025-11-16 12:34:33 +00:00
update the info on CSR
This commit is contained in:
@@ -16,7 +16,7 @@
|
|||||||
在學習系統如何實現時間中斷機制之前,我們必須先了解幾件事情:
|
在學習系統如何實現時間中斷機制之前,我們必須先了解幾件事情:
|
||||||
- 如何產生 Timer interrupt
|
- 如何產生 Timer interrupt
|
||||||
- 什麼是中斷向量表?
|
- 什麼是中斷向量表?
|
||||||
|
- CSR 暫存器
|
||||||
### 如何產生 Timer interrupt
|
### 如何產生 Timer interrupt
|
||||||
RISC-V 架構有規定,系統平台必須要有一個計時器。並且,該計時器必須具備兩個 64-bit 的暫存器 mtime 以及 mtimecmp ,前者用於紀錄當前計數器的值,後者則是 mtime 的比較值,當 value of mtime > value of mtimecmp 時便會產生中斷。
|
RISC-V 架構有規定,系統平台必須要有一個計時器。並且,該計時器必須具備兩個 64-bit 的暫存器 mtime 以及 mtimecmp ,前者用於紀錄當前計數器的值,後者則是 mtime 的比較值,當 value of mtime > value of mtimecmp 時便會產生中斷。
|
||||||
而這兩個寄存器也被定義在 [riscv.h](https://github.com/cccriscv/mini-riscv-os/blob/master/04-TimerInterrupt/riscv.h) 中:
|
而這兩個寄存器也被定義在 [riscv.h](https://github.com/cccriscv/mini-riscv-os/blob/master/04-TimerInterrupt/riscv.h) 中:
|
||||||
@@ -36,6 +36,65 @@ RISC-V 架構有規定,系統平台必須要有一個計時器。並且,該
|
|||||||
> 補充:
|
> 補充:
|
||||||
> 當異常或是中斷發生時,處理器會停止手邊的工作,再將 Program counter 的位址指向 mtvec 所指的位址並開始執行。這樣的行為就好像是主動跳入陷阱一樣,因此,在 RISC-V 的架構中將這個動作定義為 Trap ,在 xv6 (risc-v) 作業系統中,我們也可以在 Kernel 端的原始碼找到一系列處理 Interrupt 的操作 (大多定義在 Trap.c 之中)。
|
> 當異常或是中斷發生時,處理器會停止手邊的工作,再將 Program counter 的位址指向 mtvec 所指的位址並開始執行。這樣的行為就好像是主動跳入陷阱一樣,因此,在 RISC-V 的架構中將這個動作定義為 Trap ,在 xv6 (risc-v) 作業系統中,我們也可以在 Kernel 端的原始碼找到一系列處理 Interrupt 的操作 (大多定義在 Trap.c 之中)。
|
||||||
|
|
||||||
|
### CSR
|
||||||
|
RISC-V 架構定義了許多暫存器,部分暫存器被定義為控制和狀態暫存器,也就是標題所指出的 CSR (Control and status registers) ,它被用於配置或是紀錄處理器的運作狀況。
|
||||||
|
- CSR
|
||||||
|
- mtvec
|
||||||
|
當進入異常時, PC (Program counter) 會進入 mtvec 所指向的地址並繼續運行。
|
||||||
|
- mcause
|
||||||
|
紀載異常的原因
|
||||||
|
- mtval
|
||||||
|
紀載異常訊息
|
||||||
|
- mepc
|
||||||
|
進入異常前 PC 所指向的地址。若異常處理完畢, Program counter 可以讀取該位址並繼續執行。
|
||||||
|
- mstatus
|
||||||
|
進入異常時,硬體會更新 mstatus 寄存器的某些域值。
|
||||||
|
- mie
|
||||||
|
決定中斷是否被處理。
|
||||||
|
- mip
|
||||||
|
反映不同類型中斷的等待狀態。
|
||||||
|
- Memory Address Mapped
|
||||||
|
- mtime
|
||||||
|
紀錄計時器的值。
|
||||||
|
- mtimecmp
|
||||||
|
儲存計時器的比較值。
|
||||||
|
- msip
|
||||||
|
產生或結束軟體中斷。
|
||||||
|
- PLIC
|
||||||
|
|
||||||
|
此外, RISC-V 定義了一系列的指令讓開發者能夠對 CSR 暫存器進行操作:
|
||||||
|
- csrs
|
||||||
|
把 CSR 中指定的 bit 設為 1。
|
||||||
|
```assembly=
|
||||||
|
csrsi mstatus, (1 << 2)
|
||||||
|
```
|
||||||
|
上面的指令會將 mstatus 從 LSB 數起的第三個位置設成 1 。
|
||||||
|
- csrc
|
||||||
|
把 CSR 中指定的 bit 設為 0。
|
||||||
|
```assembly=
|
||||||
|
csrsi mstatus, (1 << 2)
|
||||||
|
```
|
||||||
|
上面的指令會將 mstatus 從 LSB 數起的第三個位置設成 0 。
|
||||||
|
- csrr[c|s]
|
||||||
|
將 CSR 的值讀入通用暫存器。
|
||||||
|
```assembly=
|
||||||
|
csrr to, mscratch
|
||||||
|
```
|
||||||
|
- csrw
|
||||||
|
將通用暫存器的值寫入 CSR 。
|
||||||
|
```assembly=
|
||||||
|
csrw mepc, a0
|
||||||
|
```
|
||||||
|
- csrrw[i]
|
||||||
|
將 csr 的值寫入 rd 後,且將 rs1 的值寫入 csr 。
|
||||||
|
```assembly=
|
||||||
|
csrrw rd, csr, rs1/imm
|
||||||
|
```
|
||||||
|
換個角度思考:
|
||||||
|
```assembly=
|
||||||
|
csrrw t6, mscratch, t6
|
||||||
|
```
|
||||||
|
上面的操作可以讓 t6 與 mscratch 的值互換。
|
||||||
## 系統執行
|
## 系統執行
|
||||||
|
|
||||||
首先讓我們展示一下系統的執行狀況,當你用 make clean, make 等指令建置好
|
首先讓我們展示一下系統的執行狀況,當你用 make clean, make 等指令建置好
|
||||||
|
|||||||
Reference in New Issue
Block a user