問題一:pmp怎麼配置呢?
問題二:什麼時候出發pmp的檢查呢?
PMP 是 RISC-V 中用於實現物理內存保護的機制。它允許配置多個內存保護區域,並對每個區域設置訪問權限,以防止未授權的訪問。
PMP 的功能
- 訪問控制:PMP 可以限制對內存區域的讀、寫和執行訪問。
- 區域配置:PMP 支持定義多個內存區域,每個區域可以有不同的訪問權限。
- 特權級別:PMP 可以根據特權級別(用户模式、超級模式等)設置不同的訪問權限。
PMP 的格式
PMP 配置通過一組控制寄存器(PMPCSR)和地址寄存器(PMPADDR)來實現。每個 PMP 配置段由一個配置寄存器和一個地址寄存器組成。
- PMP 配置寄存器(pmpcfg):用於配置內存區域的訪問權限和模式。
- PMP 地址寄存器(pmpaddr):用於定義內存區域的起始地址和大小。
PMP 配置寄存器(pmpcfg)的格式
每個 PMP 配置寄存器包含 8 個 8 位的字段,每個字段對應一個 PMP 配置段。
地址匹配模式:
怎麼使用呢?
1. NAPOT(Naturally Aligned Power-Of-Two)
假設我們要配置一個大小為 4KB 的 NAPOT 區域,從地址 0x80000000 開始:
# 設置 pmpaddr0,表示一個 4KB 的 NAPOT 區域(0x80000000 - 0x80000FFF)
li t0, 0x80000FF
csrw pmpaddr0, t0
li t1, 0x1F # 設置 pmpcfg0,A 字段為 NAPOT,RWX 權限
csrw pmpcfg0, t1
詳細解釋:
在這種模式下,PMP 地址寄存器的低位部分用於表示區域的大小。NAPOT 地址匹配模式的一個關鍵特點是,它通過將低位的連續一串1來表示區域的大小。
首先,將 0x80000FF 轉換為二進制:
0x80000FF = 1000 0000 0000 0000 0000 1111 1111
連續1的數量
在這個二進制數中,低位有8個連續的1:
0000 1111 1111
計算區域大小:
根據 NAPOT 的規則,區域的大小是由連續1的數量決定的。具體來説:
如果有 n 個連續的1,那麼區域的大小就是 2的n+3次方。2的8+3次方=4KB
計算區域的開始:
0x80000FF = 1000 0000 0000 0000 0000 1111 1111
在這個二進制數中:
- 高位部分:1000 0000 0000 0000 0000(即 0x80000)
- 低位部分:1111 1111(即 0xFF)
高位部分:在 PMP 地址寄存器中,高位部分用於表示區域的起始地址。
低位部分:低位部分用於表示區域的大小,通過低位連續1的數量來確定。
2. TOR(Top Of Range)地址匹配模式
在 TOR 模式下,需要使用兩個連續的 PMP 地址寄存器來定義內存區域:
起始地址:由前一個 PMP 地址寄存器定義。
結束地址:由當前 PMP 地址寄存器定義。
假設我們要配置一個從地址 0x80000000 到 0x80001000 的 TOR 區域。以下是具體的配置步驟:
-
設置起始地址
首先,設置起始地址 0x80000000 到 pmpaddr0 寄存器:li t0, 0x80000000 # 將起始地址 0x80000000 加載到 t0 寄存器中 csrw pmpaddr0, t0 # 將 t0 寄存器的值寫入 pmpaddr0 寄存器 -
設置結束地址
然後,設置結束地址 0x80001000 到 pmpaddr1 寄存器:li t1, 0x80001000 # 將結束地址 0x80001000 加載到 t1 寄存器中 csrw pmpaddr1, t1 # 將 t1 寄存器的值寫入 pmpaddr1 寄存器 -
配置 PMP 配置寄存器
最後,配置 PMP 配置寄存器 pmpcfg0,設置 A 字段為 TOR 模式,並賦予所需的權限(例如讀、寫權限):li t2, 0x9 # 設置 pmpcfg0,A 字段為 TOR 模式,RW 權限 csrw pmpcfg0, t2 # 將 t2 寄存器的值寫入 pmpcfg0 寄存器
3. NA4(Naturally Aligned 4-byte)
NA4 模式用於定義自然對齊的 4 字節內存區域。這種模式主要用於保護非常小的內存區域。
假設我們要配置一個從地址 0x80000000 開始的 4 字節的 NA4 區域。以下是具體的配置步驟:
-
設置地址
首先,設置地址 0x80000000 到 pmpaddr0 寄存器:li t0, 0x80000000 # 將地址 0x80000000 加載到 t0 寄存器中 csrw pmpaddr0, t0 # 將 t0 寄存器的值寫入 pmpaddr0 寄存器 -
配置 PMP 配置寄存器
然後,配置 PMP 配置寄存器 pmpcfg0,設置 A 字段為 NA4 模式,並賦予所需的權限(例如讀、寫和執行權限):# 0x13 = 0001 0011 li t1, 0x13 # 設置 pmpcfg0,A 字段為 NA4 模式,RWX 權限 csrw pmpcfg0, t1 # 將 t1 寄存器的值寫入 pmpcfg0 寄存器
4. OFF 模式
OFF 模式用於禁用某個 PMP 配置段。當 A 字段設置為 00 時,表示該 PMP 配置段被禁用,不會對內存訪問進行任何保護。
要禁用某個 PMP 配置段,可以將 PMP 配置寄存器的 A 字段設置為 00:
li t1, 0x0 # 設置 pmpcfg0,A 字段為 OFF 模式
csrw pmpcfg0, t1 # 將 t1 寄存器的值寫入 pmpcfg0 寄存器
PMA(Physical Memory Attributes)
PMA 是用於描述物理內存屬性的機制。PMA 通常由硬件實現,用於描述內存的類型和特性。
硬件層面的設計,一般是不可以改的。
PMP 和 PMA 的相互關係
- PMP:主要用於動態配置和管理內存保護區域,控制內存的讀、寫和執行權限。PMP 允許在運行時根據需要調整內存保護。
- PMA:用於描述物理內存的特性,通常在系統啓動時配置,並在運行時保持不變。
是否會衝突
PMP 和 PMA 通常不會直接衝突,PMP 和 PMA 的配置需要協同工作,以確保系統的正常運行。
- 如果 PMA 配置某個內存區域為只讀,而 PMP 配置允許寫入,那麼實際訪問時將受到 PMA 的限制,寫入操作將被禁止。
- 如果 PMP 配置某個內存區域為不可執行,而 PMA 配置允許執行,那麼實際訪問時將受到 PMP 的限制,執行操作將被禁止。