標(biāo)題: 無第三方庫不到5000行C語言 risc-v虛擬機(jī)juicevm [打印本頁]

作者: juicerv    時間: 2021-6-1 15:57
標(biāo)題: 無第三方庫不到5000行C語言 risc-v虛擬機(jī)juicevm
本帖最后由 juicerv 于 2021-6-1 16:09 編輯



簡介
https://github.com/juiceRv/JuiceVm
juice vm誕生于2020年,以實(shí)現(xiàn)可運(yùn)行最新kernel主線的RISC-V最小虛擬機(jī)為目標(biāo)而誕生的,設(shè)計(jì)之初秉承著可以在 RAM 只有 百KB 級別的平臺上運(yùn)行,不引入除了c99標(biāo)準(zhǔn)外的第三方依賴。

juice vm按照gcc所支持的C99標(biāo)準(zhǔn)編寫,無第三方庫依賴,淺顯易懂,且具有方便移植的特性(可快速移植到多種主流 MCU 及支持c環(huán)境的所有平臺上)。

juice vm去掉注釋后展開所有的宏的代碼行數(shù)僅12523行,僅36104字,足夠的小巧。

Juice Vm的優(yōu)點(diǎn)


Juice Vm的組成


Juice Vm 代碼統(tǒng)計(jì)


Juice Vm的地址空間分布

虛擬機(jī)版本號起始地址大小(字節(jié))寄存器名稱說明所用宏名稱
c21682d30x800000000x12C00000SRAM內(nèi)部存儲RV_CPU_SIM_RAM_START_ADDR RV_CPU_SIM_RAM_SIZE
c21682d30x92C000000x1UART_WRITEuart發(fā)送寄存器pdev_uart0_write_addr
c21682d30x92C000010x1UART_READuart接收寄存器pdev_uart0_read_addr
c21682d30x92C000020x1UART_STATEuart狀態(tài)寄存器pdev_uart0_state_addr pdev_uart0_free_state pdev_uart0_readbusy_state
c21682d30x92C000030x8mtimemtime當(dāng)前計(jì)數(shù)寄存器pdev_mtime_mtime_addr
c21682d30x92c000070x8mtimecmpmtime當(dāng)前比較寄存器pdev_mtime_mtimecmp_addr

Juice Vm下的軟件移植進(jìn)度


快速安裝


編譯中

快速上手


運(yùn)行freertos 截圖


運(yùn)行rt-thread 截圖



運(yùn)行l(wèi)inx 5.0.0 截圖


軟件參數(shù)使用說明

參數(shù)參數(shù)名稱說明
tenable test mode進(jìn)入固件測試模式<br>當(dāng)出現(xiàn)下面的狀態(tài)會結(jié)束運(yùn)行并且打印出通過還是失敗的字樣,x3_gp寄存器的值為1 和 x17_a7寄存器的值為93時,進(jìn)入了ecall異常就會觸發(fā)。x10_a0 寄存器的值為 0時打印pass字樣,否則打印fail字樣
Tenable trap debug mode使能異常調(diào)試模式,出現(xiàn)異常時會打印當(dāng)前異常的調(diào)試信息
denable debug mode打開虛擬機(jī)內(nèi)所有的調(diào)試選項(xiàng),輸出最詳細(xì)的調(diào)試信息,包括指令譯碼,處理執(zhí)行,當(dāng)前寄存器列表,csr列表等
cprint cst operation msg打開虛擬機(jī)的csr寄存器讀寫調(diào)試信息。讀寫csr寄存器的時候都會打印對應(yīng)的csr寄存器的值
adiable all debug msg關(guān)閉所有調(diào)試選項(xiàng),譯碼調(diào)試默認(rèn)打開
xenable test mode for exception打開異常測試模式,當(dāng)出現(xiàn)異常時結(jié)束運(yùn)行
genable better readability printing使用可讀性更好的方式打印信息
edisable all error msg關(guān)閉所有的錯誤信息打印
ienable all instr debug msg打開所有指令調(diào)試信息打印
menable mmu debug msg打開mmu的遍歷調(diào)試信息
pprint mmu page 8 byte datahexdump打印mmu頁表里的8字節(jié)數(shù)據(jù)
Pprint mmu page 4K Byte datahexdump打印mmu頁表里的4K字節(jié)數(shù)據(jù)
suart addr not use mmu translation啟用mmu翻譯時,忽略uart的外設(shè)地址,在啟用了mmu的時候也可以直接通過uart原始物理地址來操作uart外設(shè)
Sswitch mode debug info打開切換mode時的調(diào)試信息,m-mode,s-mode和u-mode切換的時候都會打印調(diào)試信息
Mdisable mmu err msg關(guān)閉mmu缺頁異常,訪問異常,加載異常的錯誤信息
renable trap debug msg打印更詳細(xì)的進(jìn)入中斷的調(diào)試信息
Aenable addr translation debug print打印地址轉(zhuǎn)換的調(diào)試打印
L(n)log modeoutput_mode_sel n = 0 -> stdout<br> 1 -> log_buf UNIX SYS ONLY(buf_size:2900)<br> 2 -> none<br> 選擇虛擬機(jī)輸出的方式,1,直接標(biāo)準(zhǔn)輸出。2,使用一個buf先緩存,退出的時候再輸出bug大小2900Byte。3,不輸出。<br>
lenable endless loop check (RV_ENDLESS_LOOP_CHECK_EXIT_CNT:3)啟用死循環(huán)監(jiān)測機(jī)制,當(dāng)有連續(xù)3次出現(xiàn)同樣的指令執(zhí)行流程(包括寄存器和csr寄存器的值都沒有改變),結(jié)束虛擬機(jī)的運(yùn)行。可以搭配-L參數(shù)使用,方便調(diào)試固件。一般assert都是直接死循環(huán)。

社區(qū)支持

   挖坑網(wǎng)首發(fā) 感謝暈哥一路的支持:https://whycan.com/t_5844.html

CHANGE LOG

2021-05-25




20210524進(jìn)展公布,發(fā)布包發(fā)布juice_vm_release_for_Linux_c21682d3.zip:




20210508更新:




20210427更新:

  1. 提交了RT-Thread 的適配 到官方倉庫:詳情請點(diǎn)擊[url]https://github.com/RT-Thread/rt-thread/tree/master/bsp/juicevm[/url]
復(fù)制代碼



20210424更新:

軟件適配進(jìn)度

1.已完成rt-thread移植。

更新了支持的參數(shù):




202210306更新:

軟件適配進(jìn)度


更新了支持的參數(shù):




以下 2021-03-06 更新:

無第三方庫不到5000行C語言實(shí)現(xiàn)一個risc-v虛擬機(jī),帶mmu

基于指令集 rv64i

實(shí)現(xiàn)了mtime,超級精簡的uart和mmu sv39.

更新了支持的參數(shù):


軟件適配進(jìn)度


鳴謝


聯(lián)系作者
https://github.com/juiceRv/JuiceVm
juicemail@163.com







歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1