putao -
sbi--寄存器ID用法
macros.rs
macro_rules! write_csr {
($csr_number:literal) = {
/// Writes the CSR
#[inline]
#[allow(unused_variables)]
unsafe fn _write(bits: usize) {
mat
asm
,
rust
,
risc-v
putao -
sbi--rustsbi解讀
sbi-rt :按照sbi規範制定的接口,寫的挺好的。這裏直接調用了彙編代碼
sbi-spect: sbi-rt 裏面用到一些常量
sbi-testing:測試
src: 不知道啥用。貌似某個學校寫的玩具,還有第幾章的字樣, 不能嚴謹一點嗎?
到這裏,還沒有看到具體的實現呢?
rust-qemu 能給qemu虛擬機直接用的。
整體寫的過於麻煩了,寫的底層的也不是很容易,還要
asm
,
rust
,
risc-v
,
引導
putao -
sbi--Hart 各種操作
各個狀態流轉的解釋
STARTED :HART 處於正常執行狀態。
轉移到STOP_PENDING狀態:當調用 sbi_hart_stop 之後,當前HART會請求停止。
STOP_PENDING: HART 正在停止過程中。
轉移到 STOPPED狀態: 當HART停止過程完成時。
轉移到 STARTED狀態: 如果停止過程被取消。
STOPPED : HART
asm
,
rust
,
risc-v
,
引導
putao -
sbi--sbi_send_ipi
如何確定HART掩碼對應關係
每個位的位置對應一個HART ID。例如:
第0位(最低位)對應HART 0
第1位對應HART 1
第2位對應HART 2
如果你想指定HART 1,HART掩碼將是0x2(二進制表示為0b10),因為第1位是1,其他位是0。
// 發送處理器間中斷(IPI)的函數
fn send_ipi(hart_mask: usize) - SbiR
asm
,
rust
,
risc-v
,
引導
putao -
risc-v--sv39彙編實現
在 Sv39 模式下,虛擬地址是 39 位,分為三級頁表來管理:
第一級頁表(頁目錄):負責最高的 9 位虛擬地址。
第二級頁表(頁中間目錄):負責中間的 9 位虛擬地址。
第三級頁表(頁表):負責最低的 9 位虛擬地址。
9 位虛擬地址可以表示2的9次方=512個條目。
512條目×8字節/條目=4096字節=4KB
假設我們有一個頁表,包含多個條目,每個條目佔用 8 字節:
asm
,
risc-v
putao -
risc-v 函數調用規範
RISC-V 的寄存器分為以下幾類:
臨時寄存器:t0-t6(x5-x7, x28-x31)
保存寄存器:s0-s11(x8, x9, x18-x27)
參數寄存器:a0-a7(x10-x17)
返回地址寄存器:ra(x1) 注意:不是返回值,call函數的時候的下一條指令
棧指針寄存器:sp(x2)
全局指針寄存器:gp(x3)
線程指針寄存器:tp(x
asm
,
risc-v
putao -
risc-v--PLIC中斷原理
PLIC 硬件結構包括以下幾個主要部分:
優先級寄存器(Priority Registers):每個中斷源都有一個優先級寄存器,用於設置中斷的優先級。
掛起寄存器(Pending Registers):每個掛起寄存器包含32箇中斷源的掛起狀態。
中斷使能寄存器(Enable Registers):每個hart都有一組中斷使能寄存器,用於使能或禁用特定中斷源。
閾值寄存器(T
asm
,
risc-v
putao -
risc-v--sv39分頁
sv39分頁:虛擬地址只用了39位,所以才有這個名字
問題一: PTE的格式怎麼樣? 不同的模式格式都是一樣的嗎?
問題二: MMU需要什麼樣的數據,怎麼樣提前準備呢?
問題三: 怎麼配置一個虛擬地址到物理地址到映射呢?
問題四: 內存的場景的位操作是怎麼樣的呢?
問題五: cpu怎麼知道頁的大小呢?
在RISC-V架構中,無論是Sv32、Sv39還是Sv48模式,頁表條
asm
,
risc-v
putao -
risc-v--sv39(rust版本)
這是一種面向對象的思想。 非常好!!!
satp
虛擬地址
雖然虛擬地址是 64 位的,但在 Sv39 模式下,只使用前 39 位。最高的 25 位用於符號擴展,以確保地址的正確性。具體來説:
如果位 38 是 0,則虛擬地址的高位(位 63 到 39)應全部為 0。
如果位 38 是 1,則虛擬地址的高位(位 63 到 39)應全部為 1。
這樣可以確保虛擬
asm
,
rust
,
risc-v
putao -
risc-v-- satp寄存器
問題一:cpu 怎麼知道自己用的是那種分頁方式呢? 靠MODE字段
問題二:PNN怎麼設計的呢?
問題三:多個虛擬地址對應一個物理地址怎麼辦呢?
satp(Supervisor Address Translation and Protection)寄存器用於管理地址轉換和保護機制。satp 寄存器的具體格式取決於 RISC-V 的地址空間寬度(如 32 位或 64 位)。
64位的s
asm
,
risc-v
putao -
risc-v-- PMP寄存器
問題一:pmp怎麼配置呢?
問題二:什麼時候出發pmp的檢查呢?
PMP 是 RISC-V 中用於實現物理內存保護的機制。它允許配置多個內存保護區域,並對每個區域設置訪問權限,以防止未授權的訪問。
PMP 的功能
訪問控制:PMP 可以限制對內存區域的讀、寫和執行訪問。
區域配置:PMP 支持定義多個內存區域,每個區域可以有不同的訪問權限。
特權級別:PMP 可以根據特權級
asm
,
risc-v
putao -
二進制分析實戰--環境搭建
安裝依賴環境
brew install riscv-gnu-toolchain
riscv64-unknown-elf-gcc --version
makefile
all:
riscv64-unknown-elf-gcc -g hello.c -o hello.out
#預處理
e:
riscv64-unknown-elf-gcc -E -P hello.c -o hell
二進制
,
risc-v