在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

開發者分享 | 適用于HPM的RustSBI實現

先楫半導體HPMicro ? 2025-02-08 13:44 ? 次閱讀

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

劃線部分鏈接為:

RISC-V 上的 Linux 啟動流程

ARM 架構中,通常 Linux 的啟動流程為:

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

而在具有 S 態的 RISC-V 架構中,通常的啟動流程為:

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

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

SBI (Supervisor Binary Interface)

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

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

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

· 多功能且可拓展的操作系統運行時

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

·支持 RISC-V SBI 規范 v2.0

·使用 Rust 編寫,使用穩定版本的 Rust 工具鏈構建

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

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

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

啟動鏡像布局

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

部分實現細節

Zicntr 指令集拓展支持

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

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、觸發非法指令異常后從 mtval 寄存器中讀取到非法指令;

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

3、如果是,則將 MCHTMR 外設中 MTIME 寄存器的值保存至 rd 寄存器中。并恢復現場并從異常指令的下一條指令開始執行;

4、如果不是,則將異常委托給 Linux 內核處理。模擬異常發生時的硬件行為,填充對應寄存器并更新 mstatus:MPP ,使異常返回后的特權級別為 S-mode,最后將 mepc 寄存器覆蓋為 stvec 的值,異常返回后將從 Linux 內核的異常處理函數入口開始執行。具體實現細節請參考:

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

請手動跳轉

SDRAM 區域原子指令的支持

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

1、AMO 指令

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

2、lr / sc

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

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

設備樹

/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";
};
};
};

實現效果

目前已經成功實現 Linux 6.10 內核啟動引導,并傳遞設備樹給內核。

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

coremark 跑分結果:

~ # 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 測試結果,可以看出緩內的讀取速度是非常快的,超出緩存范圍后讀取速度受限于 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 的系統鏡像,歡迎各位開發者下載體驗。

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)在本項目開發過程中提供的建議和支持!同時他也是 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

以上內容來自先楫開發者的原創分享。

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

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

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

    關注

    146

    文章

    17347

    瀏覽量

    352708
  • Linux
    +關注

    關注

    87

    文章

    11350

    瀏覽量

    210446
  • HPM
    HPM
    +關注

    關注

    1

    文章

    38

    瀏覽量

    7789
收藏 人收藏

    評論

    相關推薦

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

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

    開發者分享 | 基于先楫RT-Thread BSP,使用CLion開發應用

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

    適用于每個LabVIEW開發者的巧妙調試技巧

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

    適用于STM32芯片的開發教程

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

    適用于移動終端的GUI設計與實現

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

    適用于PDA的PLC編程系統開發

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

    中國大陸開發者可以注冊Apple Developer應用程序

    從今天開始,中國的開發人員現在可以使用適用于iOS的Apple Developer應用程序加入蘋果開發者計劃。
    的頭像 發表于 12-18 10:43 ?3860次閱讀

    微軟Windows 10將適用于Your Phone應用

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

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

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

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

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

    華為開發者大會2021智能硬件開發— 使用HPM定制產品

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

    2021 OPPO開發者大會主會場:多模態、簡單AI,賦能開發者價值實現

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

    適用于學生和愛好的ATMega16 AVR開發

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

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

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

    NVIDIA cuPQC幫助開發適用于量子計算時代的加密技術

    NVIDIA cuPQC 可為相關開發者提供加速計算支持,幫助開發適用于量子計算時代的加密技術。cuPQC 庫可利用 GPU 并行性,為要求嚴苛的安全算法提供支持。
    的頭像 發表于 03-22 09:53 ?482次閱讀
    主站蜘蛛池模板: 久久草在线观看 | 免费国产综合视频在线看 | 天天插伊人 | 狠狠狠色丁香婷婷综合激情 | 午夜看一级特黄a大片黑 | 特黄特色大片免费视频大全 | 老师叫我揉她内裤越快越好 | 久久黄色网 | 四虎最新紧急入口4hu | 美女扒开尿口让男生添 漫画 | 亚洲成片在线观看12345ba | 久久狼人综合 | 日本色片在线观看 | 视频在线一区 | 亚洲香蕉影院 | 亚洲成a人片在线观看www | 给我一个可以看片的www日本 | 国产三级日本三级美三级 | 福利体验区 | 牛仔裤美女国产精品毛片 | 手机看片三级 | 午夜肉伦伦影院 | 亚洲精品二区中文字幕 | 国产99在线| 亚洲国产一区二区在线 | 日本在线观看www | 辣h高h肉h激h超h | 7m凹凸精品分类大全免费 | 人人揉人人爽五月天视频 | 老子影院午夜精品欧美视频 | 无遮挡很爽很污很黄很色的网站 | 爱爱天堂 | 午夜操一操 | 国产1卡2卡三卡四卡网站 | 欧美精品 在线播放 | 免费看啪啪网站 | 黄色大片毛片 | 夜色321看片资源站 夜色sese | 久久久久99精品成人片三人毛片 | 97人摸人人澡人人人超一碰 | 国产成人夜间影院在线观看 |