chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

開發(fā)者分享 | 適用于HPM的RustSBI實現(xiàn)

先楫半導體HPMicro ? 2025-02-08 13:44 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

HPMicro 的 MCU 一直以高性能著稱,之前也一直有想在 HPM 的 MCU 上運行 Linux 的想法。直到看見 Linux 6.10 中支持了 RISC-V 架構(gòu)在 S-mode 中運行 nommu 內(nèi)核*,才下定決心開始在 HPM6360 上折騰 nommu Linux。

劃線部分鏈接為:

RISC-V 上的 Linux 啟動流程

ARM 架構(gòu)中,通常 Linux 的啟動流程為:

bf5789a8-e5df-11ef-9434-92fbcf53809c.png

而在具有 S 態(tài)的 RISC-V 架構(gòu)中,通常的啟動流程為:

bf84182e-e5df-11ef-9434-92fbcf53809c.jpg

其中 BootROM、Loader 和 SBI Runtime 運行 M-mode(機器模式)下,具體的引導程序和 Linux 等操作系統(tǒng)內(nèi)核運行在 S-mode(監(jiān)管者模式)下,而用戶進程運行在 U-mode(用戶模式)中。我們看到 RISC-V 的啟動流程中相比 ARM 多了一個 SBI Runtime,那么什么是 SBI?

SBI (Supervisor Binary Interface)

RISC-V 架構(gòu)中,存在著定義于操作系統(tǒng)之下的運行環(huán)境(Runtime)。這個運行環(huán)境不僅將引導啟動 RISC-V 下的操作系統(tǒng), 還將常駐后臺,為操作系統(tǒng)提供一系列二進制接口,以便其獲取和操作硬件信息。RISC-V 給出了此類環(huán)境和二進制接口的規(guī)范,稱為“監(jiān)管者二進制接口”,即 “SBI”。

SBI 有多種實現(xiàn),如 Berkeley Boot Loader (BBL)、OpenSBI。而本次項目中使用的 SBI 實現(xiàn)為 RustSBI

RustSBI項目源于2020年清華操作系統(tǒng)夏令營,旨在使用 Rust 語言編寫 RISC-V 指令集中的 SBI 實現(xiàn),支撐上層系統(tǒng)軟件比如操作系統(tǒng)的運行。在國際 SBI 實現(xiàn)列表中獲得 編號四。具有以下功能:

· 多功能且可拓展的操作系統(tǒng)運行時

·為物理機、虛擬機、模擬器提供支持和兼容性

·支持 RISC-V SBI 規(guī)范 v2.0

·使用 Rust 編寫,使用穩(wěn)定版本的 Rust 工具鏈構(gòu)建

由于 HPM 系列芯片的啟動設(shè)備較為單一(XPI),且 XPI 的初始化工作已經(jīng)在 BootROM 中完成并映射到地址空間中,同時為了加快啟動速度,本項目最終沒有移植 U-Boot;而是基于 RustSBI 庫,編寫操作系統(tǒng)的 Bootloader,實現(xiàn) SDRAM 初始化、固件加載、設(shè)備樹傳遞和內(nèi)核跳轉(zhuǎn)等功能,以及為操作系統(tǒng)提供監(jiān)管者二進制接口(SBI)。

最終在 HPM6360 芯片上的啟動流程如下:

bfc7b9d0-e5df-11ef-9434-92fbcf53809c.png

啟動鏡像布局

c000d170-e5df-11ef-9434-92fbcf53809c.png

部分實現(xiàn)細節(jié)

Zicntr 指令集拓展支持

Linux 內(nèi)核中,使用了 TIME TIMEH 這兩個 CSR 寄存器來獲取系統(tǒng)時鐘用于調(diào)度。但 HPM6360 使用的 Andes D45 核心并沒有實現(xiàn)這兩個 CSR 寄存器,在執(zhí)行 csrrs rd, time, rs1 csrrs rd, timeh, rs1 指令時會產(chǎn)生非法指令異常(Illegal Instruction)。這就需要軟件在異常處理函數(shù)中模擬這兩條指令的執(zhí)行。

static inline cycles_t get_cycles(void)
{
return csr_read(CSR_TIME);
}
#define get_cycles get_cycles

static inline u32 get_cycles_hi(void)
{
return csr_read(CSR_TIMEH);
}
#define get_cycles_hi get_cycles_hi

#endif /* !CONFIG_RISCV_M_MODE */

#ifdef CONFIG_64BIT
static inline u64 get_cycles64(void)
{
return get_cycles();
}
#else /* CONFIG_64BIT */
static inline u64 get_cycles64(void)
{
u32 hi, lo;

do {
hi = get_cycles_hi();
lo = get_cycles();
} while (hi != get_cycles_hi());

return ((u64)hi << 32) | lo;
}
#endif /* CONFIG_64BIT */

arch/riscv/include/asm/timex.h:51

c02fbbc0-e5df-11ef-9434-92fbcf53809c.png

這里我使用了 riscv-decode 這個庫對機器碼進行解碼。

1、觸發(fā)非法指令異常后從 mtval 寄存器中讀取到非法指令;

2、將其作為參數(shù)調(diào)用 riscv_decode::decode() 函數(shù)進行解碼,獲取到 CSR 以及 rd 的值,判斷是否為 TIME:0xc01 TIMEH:0xc81 這兩個 CSR 寄存器;

3、如果是,則將 MCHTMR 外設(shè)中 MTIME 寄存器的值保存至 rd 寄存器中。并恢復(fù)現(xiàn)場并從異常指令的下一條指令開始執(zhí)行;

4、如果不是,則將異常委托給 Linux 內(nèi)核處理。模擬異常發(fā)生時的硬件行為,填充對應(yīng)寄存器并更新 mstatus:MPP ,使異常返回后的特權(quán)級別為 S-mode,最后將 mepc 寄存器覆蓋為 stvec 的值,異常返回后將從 Linux 內(nèi)核的異常處理函數(shù)入口開始執(zhí)行。具體實現(xiàn)細節(jié)請參考:

https://github.com/rustsbi/rustsbi-hpm/blob/194d9cc7899fef320ac9e4b8e2c57ffca3eafe34/src/trap.rs#L51-L67

請手動跳轉(zhuǎn)

SDRAM 區(qū)域原子指令的支持

在調(diào)試過程中發(fā)現(xiàn),HPM6360 無法在 SDRAM 的地址范圍中執(zhí)行原子指令,會產(chǎn)生存儲/原子指令訪問錯誤異常(Store/AMO Access Fault)。而 Linux 內(nèi)核中有部分操作調(diào)用了原子指令(例如加鎖等同步操作),在 CPU 不支持原子指令的情況下 Linux 內(nèi)核無法運行。這里同樣可以基于異常對原子指令進行模擬。

1、AMO 指令

在執(zhí)行 AMO 指令時,會陷入存儲/原子指令訪問錯誤異常。同樣的,我們需要從 mepc 指向的指令地址獲取出錯的原子指令,并進行模擬。

2、lr / sc

對于 lr (Load Reserved) 和 sc (Store Conditional) 指令的情況則有一些特殊。 lr 指令執(zhí)行時會觸發(fā)加載指令訪問錯誤異常(Load Access Fault),但 sc 指令在執(zhí)行時不會觸發(fā)任何異常,rd 寄存器的結(jié)果直接返回 1 ,則就導致無法直接模擬該指令的執(zhí)行。

這里我選擇的解決辦法是:在執(zhí)行到 lr 指令時,先對 lr 指令進行模擬,然后查找后續(xù)內(nèi)存地址中的 sc 指令,并將其替換為非法指令(實際使用的是 csrrw zero, time, zero)。這樣在執(zhí)行到原先 sc 指令的位置時就會觸發(fā)非法指令異常。在異常處理函數(shù)中,判斷是否是原先替換指令的地址,如果是,則還原被替換的 sc 指令,并模擬指令執(zhí)行,隨后異常退出至下一條指令繼續(xù)執(zhí)行;如果不是,則將異常委托給內(nèi)核處理。

設(shè)備樹

/dts-v1/;

/ {
#address-cells = <0x01>;
#size-cells = <0x01>;
compatible = "hpmicro,hpm6360";
model = "HPMicro HPM6360 Evaluate Kit";

aliases {
serial0 = &uart0;
};

chosen {
bootargs = "earlycon=sbi console=hvc0 ignore_loglevel rootwait root=/dev/mtdblock0";
stdout-path = "hvc0";
};

memory@40000000 {
device_type = "memory";
reg = <0x40000000 0x02000000>;
};

cpus {
#address-cells = <0x01>;
#size-cells = <0x00>;
timebase-frequency = <1000000>;

cpu@0 {
phandle = <0x01>;
device_type = "cpu";
reg = <0x00>;
status = "okay";
compatible = "riscv";
riscv,isa = "rv32imafdcp";
riscv,isa-base = "rv32i";
riscv,isa-extensions = "i", "m", "a", "f", "d", "c", "zicsr",
"zifencei", "zihpm";
mmu-type = "riscv,none";

interrupt-controller {
#interrupt-cells = <0x01>;
interrupt-controller;
compatible = "riscv,cpu-intc";
};
};
};

soc {
#address-cells = <0x01>;
#size-cells = <0x01>;
compatible = "simple-bus";
ranges;

rom@80400000 {
compatible = "mtd-rom";
reg = <0x80400000 0xC00000>;
bank-width = <1>;
};

uart0: uart0@f0040000 {
compatible = "hpmicro,hpm6360-uart";
reg = <0xf0040000 0x40>;
clock-frequency = <24000000>;
status = "okay";
};
};
};

實現(xiàn)效果

目前已經(jīng)成功實現(xiàn) Linux 6.10 內(nèi)核啟動引導,并傳遞設(shè)備樹給內(nèi)核。

c08b80ae-e5df-11ef-9434-92fbcf53809c.gif

coremark 跑分結(jié)果:

~ # coremark
2K performance run parameters for coremark.
CoreMark Size : 666
Total ticks : 13913
Total time (secs): 13.913000
Iterations/Sec : 1437.504492
Iterations : 20000
Compiler version : GCC13.3.0
Compiler flags : -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -O2 -g0 -fPIC -Wl,-elf2flt=-r -static -lrt
Memory location : Please put data memory location here
(e.g. code in flash, data on heap etc)
seedcrc : 0xe9f5
[0]crclist : 0xe714
[0]crcmatrix : 0x1fd7
[0]crcstate : 0x8e3a
[0]crcfinal : 0x382f
Correct operation validated. See readme.txt for run and reporting rules.
CoreMark 1.0 : 1437.504492 / GCC13.3.0 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -O2 -g0 -fPIC -Wl,-elf2flt=-r -static -lrt / Heap

ramspeed 測試結(jié)果,可以看出緩內(nèi)的讀取速度是非??斓模鼍彺娣秶笞x取速度受限于 SDARM 的速度:

~ # ramspeed -b 2 -g 1 -m 1 -r
RAMspeed (GENERIC) v2.6.0 by Rhett M. Hollander and Paul V. Bolotoff, 2002-09

1Gb per pass mode

INTEGER & READING 1 Kb block: 1460.57 Mb/s
INTEGER & READING 2 Kb block: 1487.33 Mb/s
INTEGER & READING 4 Kb block: 1498.92 Mb/s
INTEGER & READING 8 Kb block: 1505.16 Mb/s
INTEGER & READING 16 Kb block: 1507.90 Mb/s
INTEGER & READING 32 Kb block: 1301.73 Mb/s
INTEGER & READING 64 Kb block: 116.71 Mb/s
INTEGER & READING 128 Kb block: 116.79 Mb/s
INTEGER & READING 256 Kb block: 116.81 Mb/s
INTEGER & READING 512 Kb block: 116.82 Mb/s
INTEGER & READING 1024 Kb block: 116.74 Mb/s

最后附上倉庫地址,同時也提供了 pre-built 的系統(tǒng)鏡像,歡迎各位開發(fā)者下載體驗。

1、rustsbi-hpm:

https://github.com/rustsbi/rustsbi-hpm

2、linux:

https://github.com/hpm-rs/linux

3、buildroot:

https://github.com/hpm-rs/buildroot

HPMICRO

鳴謝

感謝華中科技大學洛佳同學 (https://github.com/luojia65)在本項目開發(fā)過程中提供的建議和支持!同時他也是 RustSBI 的作者。

感謝華中科技大學王振辰同學(https://github.com/Plucky923)完善了 riscv-decode 庫對 RVA 指令集解碼的支持!(https://github.com/fintelia/riscv-decode/pull/6)

參考

https://riscv.org/wp-content/uploads/2019/06/13.30-RISCV_OpenSBI_Deep_Dive_v5.pdf


https://github.com/rustsbi/rustsbi


https://github.com/fintelia/riscv-decode

以上內(nèi)容來自先楫開發(fā)者的原創(chuàng)分享。

我們始終相信開發(fā)者共創(chuàng)的力量。先楫社區(qū)堅持開源共享、互惠互利,貼近每一個開發(fā)者,一步一個腳印,一點一滴積累,為成為更好的我們而不斷努力。

心之所向,銳意進取,星辰大海,恣意成長。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    146

    文章

    17984

    瀏覽量

    367172
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11511

    瀏覽量

    213861
  • HPM
    HPM
    +關(guān)注

    關(guān)注

    1

    文章

    43

    瀏覽量

    8015
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    開發(fā)者分享|先楫半導體hpm_sdk使用vscode進行開發(fā)

    一、概述先楫半導體的hpm_sdk,對于習慣用keil的開發(fā)者可能不太習慣,但是從開發(fā)角度上看,是比較靈活的,可以給開發(fā)者一定的發(fā)揮空間。該sdk支持cmake構(gòu)建,可以在多個支持cm
    的頭像 發(fā)表于 06-30 10:01 ?4709次閱讀
    <b class='flag-5'>開發(fā)者</b>分享|先楫半導體<b class='flag-5'>hpm</b>_sdk使用vscode進行<b class='flag-5'>開發(fā)</b>

    開發(fā)者分享 | 基于先楫RT-Thread BSP,使用CLion開發(fā)應(yīng)用

    本期開發(fā)者:朱彥祖RT-Thread資深工程師,HPM6700/6400元老級開發(fā)者及骨灰級用戶,先輯生態(tài)社區(qū)常駐優(yōu)秀開發(fā)者,江湖人稱杭州吳彥祖。背景最近在使用先輯
    的頭像 發(fā)表于 06-07 08:17 ?3819次閱讀
    <b class='flag-5'>開發(fā)者</b>分享 | 基于先楫RT-Thread BSP,使用CLion<b class='flag-5'>開發(fā)</b>應(yīng)用

    適用于每個LabVIEW開發(fā)者的巧妙調(diào)試技巧

    調(diào)試一個大型的高度并行應(yīng)用程序,則包含NI開發(fā)者套件 2011的LabVIEW桌面執(zhí)行跟蹤工具包就是您進行LabVIEW代碼分析的“利器”。 它可提供關(guān)于正在運行的應(yīng)用程序的各種信息,包括詳細的內(nèi)存
    發(fā)表于 10-27 14:32

    適用于STM32芯片的開發(fā)教程

    安富萊的論壇上也有很多有關(guān)單片機方面的有用的資料,大家可以參考。本文不僅適用于STM32芯片的開發(fā),也適用于其它芯片。正文學習一款新的芯片,需要大家從官方獲取兩方面的資料,一個是相關(guān)的技術(shù)文檔,比如參數(shù)手冊、數(shù)據(jù)手冊、應(yīng)用筆記等
    發(fā)表于 12-09 06:54

    適用于移動終端的GUI設(shè)計與實現(xiàn)

    介紹一種適用于移動終端的圖形用戶界面(GUI)系統(tǒng)的設(shè)計與實現(xiàn),使基于該GUI系統(tǒng)開發(fā)的移動終端應(yīng)用程序具有美觀統(tǒng)一的圖形界面,使用方便快捷。
    發(fā)表于 09-22 09:57 ?10次下載

    適用于PDA的PLC編程系統(tǒng)開發(fā)

    適用于PDA的PLC編程系統(tǒng)開發(fā):傳統(tǒng)上調(diào)試PLC通常采用手持式PLC編程器,且只能適用于相應(yīng)型號的PLC,上位計算機上的編程軟件無法適用于現(xiàn)場實時調(diào)試、編輯程序. 本系統(tǒng)在分析PLC
    發(fā)表于 12-29 23:49 ?35次下載

    中國大陸開發(fā)者可以注冊Apple Developer應(yīng)用程序

    從今天開始,中國的開發(fā)人員現(xiàn)在可以使用適用于iOS的Apple Developer應(yīng)用程序加入蘋果開發(fā)者計劃。
    的頭像 發(fā)表于 12-18 10:43 ?4077次閱讀

    微軟Windows 10將適用于Your Phone應(yīng)用

    微軟在Build 2018開發(fā)者大會上宣布了適用于Windows 10用戶的Your Phone(你的手機)應(yīng)用,作為Windows 10 PC和安卓等手機的傳輸管理工具。
    的頭像 發(fā)表于 03-01 15:13 ?2559次閱讀

    Graphcore發(fā)布基于IPU開發(fā)者云,適用于AI模型的訓練和推理

    7月8日消息,Graphcore今日正式發(fā)布基于IPU的開發(fā)者云,面向中國的客戶、大學、研究機構(gòu)和個人研究免費使用,使得前沿的機器智能創(chuàng)新可以輕松獲取IPU進行前沿AI模型的云端訓練與推理,從而
    的頭像 發(fā)表于 07-09 14:28 ?2456次閱讀

    適用于M1 MacBook的Firefox和Chrome瀏覽器上線

    援引外媒 9to5Google 報道,適用于 Apple Silicon Mac 設(shè)備的 Chrome 瀏覽器已經(jīng)開放下載。此外,開發(fā)者也表示適用于 M1 Mac 的 Firefox 84 Beta 目前正在
    的頭像 發(fā)表于 11-19 11:12 ?2737次閱讀

    華為開發(fā)者大會2021智能硬件開發(fā)— 使用HPM定制產(chǎn)品

    2021年10月22日~24日,華為將在中國松山湖舉行2021華為開發(fā)者大會,聚焦鴻蒙系統(tǒng)、智能家居、智慧辦公、HMS Core 等熱門話題,與華為專家、行業(yè)大咖、全球開發(fā)者一起探討全場景智慧
    的頭像 發(fā)表于 10-23 12:30 ?1484次閱讀
    華為<b class='flag-5'>開發(fā)者</b>大會2021智能硬件<b class='flag-5'>開發(fā)</b>— 使用<b class='flag-5'>HPM</b>定制產(chǎn)品

    2021 OPPO開發(fā)者大會主會場:多模態(tài)、簡單AI,賦能開發(fā)者價值實現(xiàn)

    2021 OPPO開發(fā)者大會主會場:多模態(tài)、簡單AI,賦能開發(fā)者價值實現(xiàn)
    的頭像 發(fā)表于 10-27 10:49 ?1574次閱讀
    2021 OPPO<b class='flag-5'>開發(fā)者</b>大會主會場:多模態(tài)、簡單AI,賦能<b class='flag-5'>開發(fā)者</b>價值<b class='flag-5'>實現(xiàn)</b>

    適用于學生和愛好的ATMega16 AVR開發(fā)

    電子發(fā)燒友網(wǎng)站提供《適用于學生和愛好的ATMega16 AVR開發(fā)板.zip》資料免費下載
    發(fā)表于 07-15 14:19 ?1次下載
    <b class='flag-5'>適用于</b>學生和愛好<b class='flag-5'>者</b>的ATMega16 AVR<b class='flag-5'>開發(fā)</b>板

    適用于低視力用戶的觸覺接近模塊(HPM)

    電子發(fā)燒友網(wǎng)站提供《適用于低視力用戶的觸覺接近模塊(HPM).zip》資料免費下載
    發(fā)表于 11-14 09:25 ?1次下載
    <b class='flag-5'>適用于</b>低視力用戶的觸覺接近模塊(<b class='flag-5'>HPM</b>)

    NVIDIA cuPQC幫助開發(fā)適用于量子計算時代的加密技術(shù)

    NVIDIA cuPQC 可為相關(guān)開發(fā)者提供加速計算支持,幫助開發(fā)適用于量子計算時代的加密技術(shù)。cuPQC 庫可利用 GPU 并行性,為要求嚴苛的安全算法提供支持。
    的頭像 發(fā)表于 03-22 09:53 ?846次閱讀