博客 / 詳情

返回

risc-v-- PMP寄存器

問題一:pmp怎麼配置呢?
問題二:什麼時候出發pmp的檢查呢?

PMP 是 RISC-V 中用於實現物理內存保護的機制。它允許配置多個內存保護區域,並對每個區域設置訪問權限,以防止未授權的訪問。
PMP 的功能

  1. 訪問控制:PMP 可以限制對內存區域的讀、寫和執行訪問。
  2. 區域配置:PMP 支持定義多個內存區域,每個區域可以有不同的訪問權限。
  3. 特權級別:PMP 可以根據特權級別(用户模式、超級模式等)設置不同的訪問權限。

PMP 的格式
PMP 配置通過一組控制寄存器(PMPCSR)和地址寄存器(PMPADDR)來實現。每個 PMP 配置段由一個配置寄存器和一個地址寄存器組成。

  1. PMP 配置寄存器(pmpcfg):用於配置內存區域的訪問權限和模式。
  2. PMP 地址寄存器(pmpaddr):用於定義內存區域的起始地址和大小。

PMP 配置寄存器(pmpcfg)的格式
每個 PMP 配置寄存器包含 8 個 8 位的字段,每個字段對應一個 PMP 配置段。
截屏2024-07-07 08.12.19.png

地址匹配模式:
截屏2024-07-07 08.12.57.png


怎麼使用呢?

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

在這個二進制數中:

  1. 高位部分:1000 0000 0000 0000 0000(即 0x80000)
  2. 低位部分:1111 1111(即 0xFF)
    高位部分:在 PMP 地址寄存器中,高位部分用於表示區域的起始地址。
    低位部分:低位部分用於表示區域的大小,通過低位連續1的數量來確定。

2. TOR(Top Of Range)地址匹配模式

在 TOR 模式下,需要使用兩個連續的 PMP 地址寄存器來定義內存區域:
起始地址:由前一個 PMP 地址寄存器定義。
結束地址:由當前 PMP 地址寄存器定義。

假設我們要配置一個從地址 0x80000000 到 0x80001000 的 TOR 區域。以下是具體的配置步驟:

  1. 設置起始地址
    首先,設置起始地址 0x80000000 到 pmpaddr0 寄存器:

    li t0, 0x80000000  # 將起始地址 0x80000000 加載到 t0 寄存器中
    csrw pmpaddr0, t0  # 將 t0 寄存器的值寫入 pmpaddr0 寄存器
  2. 設置結束地址
    然後,設置結束地址 0x80001000 到 pmpaddr1 寄存器:

    li t1, 0x80001000  # 將結束地址 0x80001000 加載到 t1 寄存器中
    csrw pmpaddr1, t1  # 將 t1 寄存器的值寫入 pmpaddr1 寄存器
  3. 配置 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 區域。以下是具體的配置步驟:

  1. 設置地址
    首先,設置地址 0x80000000 到 pmpaddr0 寄存器:

    li t0, 0x80000000  # 將地址 0x80000000 加載到 t0 寄存器中
    csrw pmpaddr0, t0  # 將 t0 寄存器的值寫入 pmpaddr0 寄存器
  2. 配置 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 的相互關係

  1. PMP:主要用於動態配置和管理內存保護區域,控制內存的讀、寫和執行權限。PMP 允許在運行時根據需要調整內存保護。
  2. PMA:用於描述物理內存的特性,通常在系統啓動時配置,並在運行時保持不變。

是否會衝突
PMP 和 PMA 通常不會直接衝突,PMP 和 PMA 的配置需要協同工作,以確保系統的正常運行。

  1. 如果 PMA 配置某個內存區域為只讀,而 PMP 配置允許寫入,那麼實際訪問時將受到 PMA 的限制,寫入操作將被禁止。
  2. 如果 PMP 配置某個內存區域為不可執行,而 PMA 配置允許執行,那麼實際訪問時將受到 PMP 的限制,執行操作將被禁止。
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.