博客 / 列表

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_remote_sfence

規範: Function Name SBI Version FID EID sbi_remote_fence_i 0.2 0 0x52464E43 清除所有目標HART的指令緩存 sbi_remote_sfence_vma 0.2 1 0x52464E43 使所有目標HA

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 - sbi--底層原理以及調用規範(sbi_call)

用rust 實現規範的定義 // 定義 SbiRet 結構體,用於存儲 SBI 調用的返回值 struct SbiRet { error: i64, value: i64, } /// 實現一個封裝SBI調用的函數 #[inline(always)] fn sbi_call(extension: usize, function: usize, arg0: usize, arg1

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