找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2696|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

無第三方庫不到5000行C語言 risc-v虛擬機(jī)juicevm

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:930728 發(fā)表于 2021-6-1 15:57 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
本帖最后由 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 級(jí)別的平臺(tái)上運(yùn)行,不引入除了c99標(biāo)準(zhǔn)外的第三方依賴。

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

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

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

  • 資源占用極低。
  • 跨平臺(tái)、可快速移植。

Juice Vm的組成

  • 指令集:RV64IMASU.
  • 支持了M-mode,U-mode,S-mode下的mtime.
  • 超級(jí)精簡的uart,只有讀和寫兩個(gè)外設(shè)寄存器.
  • 超級(jí)精簡的MMU SV39支持.
  • 支持RISC-V官方標(biāo)準(zhǔn)的異常和中斷托管

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


Juice Vm的地址空間分布

虛擬機(jī)版本號(hào)起始地址大小(字節(jié))寄存器名稱說明所用宏名稱
c21682d30x800000000x12C00000SRAM內(nèi)部存儲(chǔ)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)度

  • 已經(jīng)支持了c語言編程。
  • 已完成freertos移植。
  • 已完成mbedtls移植。
  • 已完成mmu sv39測試。
  • 已完成mtime測試。
  • 已完成opensbi移植 傳送門。
  • 已完成rt-thread移植,感謝@熊大和@Andy Chen的支持 傳送門。
  • 已完成kernel主線5.0.0 傳送門。
  • 上傳Juice Vm下的GCC toolchain 傳送門
  • 適配 GDB 通用接口支持 TODO。
  • 適配 RT-SMART TODO。

快速安裝

  • UBUNTU/DEBIAN APT安裝
    1.   echo "deb [url]http://xiaohui.mongoyun.com:3333/[/url] trusty main" | sudo tee -a /etc/apt/sources.list
    2.   wget -O - [url]http://xiaohui.mongoyun.com:3333/key/deb.gpg.key[/url] | sudo apt-key add -
    3.   sudo apt update
    4.   sudo apt install juicevm
    5.   juicevm
    復(fù)制代碼

  • CENTOS
    1.   echo "deb [url]http://xiaohui.mongoyun.com:3333/[/url] trusty main" | sudo tee -a /etc/apt/sources.list
    2.   wget -O juice_vm_release_for_Linux_laster.zip [url]https://github.com/juiceRv/JuiceVm/raw/master/juice_vm_release_for_Linux_laster.zip[/url]
    3.   unzip juice_vm_release_for_Linux_laster.zip
    4.   cd juice_vm_release_for_Linux_c21682d3/juice_vm_release_for_Linux
    5.   sudo chmod +x juice_vm_for_Linux.out
    6.   ./juice_vm_for_Linux.out
    復(fù)制代碼

  • WINDOW

編譯中

快速上手


運(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)會(huì)結(jié)束運(yùn)行并且打印出通過還是失敗的字樣,x3_gp寄存器的值為1 和 x17_a7寄存器的值為93時(shí),進(jìn)入了ecall異常就會(huì)觸發(fā)。x10_a0 寄存器的值為 0時(shí)打印pass字樣,否則打印fail字樣
Tenable trap debug mode使能異常調(diào)試模式,出現(xiàn)異常時(shí)會(huì)打印當(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寄存器的時(shí)候都會(huì)打印對(duì)應(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)異常時(shí)結(jié)束運(yùn)行
genable better readability printing使用可讀性更好的方式打印信息
edisable all error msg關(guān)閉所有的錯(cuò)誤信息打印
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翻譯時(shí),忽略u(píng)art的外設(shè)地址,在啟用了mmu的時(shí)候也可以直接通過uart原始物理地址來操作uart外設(shè)
Sswitch mode debug info打開切換mode時(shí)的調(diào)試信息,m-mode,s-mode和u-mode切換的時(shí)候都會(huì)打印調(diào)試信息
Mdisable mmu err msg關(guān)閉mmu缺頁異常,訪問異常,加載異常的錯(cuò)誤信息
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,使用一個(gè)buf先緩存,退出的時(shí)候再輸出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:

  • 修復(fù)了mtime在m-mode,s-mode和u-mode下的中斷處理漏洞。
  • 修復(fù)了ecall在s-mode下的漏洞。
  • 修復(fù)了在s-mode和u-mode下進(jìn)入異常模式,更新csr寄存器的漏洞。
  • 移植了linux。  

    juice_vm成功運(yùn)行kernel主線5.0.0。
    juice_vm成功運(yùn)行kernel主線5.0.0。
    juice_vm成功運(yùn)行kernel主線5.0.0。



20210508更新:

  • 上傳一個(gè)ubuntu20.04上可以正常運(yùn)行的發(fā)布包,感謝@XBOOT大佬的反饋。
  • 添加了div指令支持。
  • 修復(fù)了divuw,divw,remu,remw,amomin.w,amoswap.w的指令錯(cuò)誤。



20210427更新:

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



20210424更新:

軟件適配進(jìn)度

1.已完成rt-thread移植。

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

  • 新增-L參數(shù)用于指定打印日志方式。
  • 新增-l參數(shù)用于在出現(xiàn)死循環(huán)的時(shí)候結(jié)束運(yùn)行。
  • 新增-r參數(shù)用于開啟trap調(diào)試打印
  • 更新了Alive logo。
  • 新增-T參數(shù)用于執(zhí)行過程輸出反匯編調(diào)試打印。
  • 新增m模塊支持。
  • 新增s-mode支持(u-mode支持中)。



202210306更新:

軟件適配進(jìn)度

  • 已經(jīng)支持了c語言編程。
  • 已完成freertos移植。
  • 已完成mebedtls移植。
  • 已完成mmu sv39測試。
  • 已完成mtimer測試。
  • 已完成opensbi移植。

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

  • -m 參數(shù)用于開啟mmu調(diào)試信息

    提交日志
  • 1113e998 add sfence.vma instr
  • f118d476 add print instr support
  • 1e3e7204 add AMOSWAP.D LR.D and SC.D instr support
  • 686741ea add AMOSWAP.D LR.D and SC.D instr support
  • f2f699c0 add -i arg to enable instr print support
  • 113f66da add misa csr support
  • 19cf60d1 fix divu err
  • ad512e54 add divu remw and remu instr
  • 9abc0566 fix mem overflow
  • 0ceb663e fix divw instr and add REMW instr
  • 10a2ea78 fix divw instr
  • 9c93c4ce add amoswap.w , mul and divw instr
  • df10ad45 change the fireware start addr to 0x80000000
  • d31b4ac1 add amoadd.w inst



以下 2021-03-06 更新:

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

基于指令集 rv64i

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

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

  • -a 關(guān)閉所有調(diào)試打印
  • -e 關(guān)閉錯(cuò)誤打印
  • -g 用更好的方式來顯示打印
  • -d 開啟所有調(diào)試打印(包括寄存器和csr列表)
  • -i 開啟指令解碼調(diào)試信息
  • -m 開啟mmu調(diào)試信息

軟件適配進(jìn)度

  • 已經(jīng)支持了c語言編程。
  • 已完成freertos移植。
  • 已完成mebedtls移植。
  • 已完成mmu sv39測試。
  • 已完成mtimer測試。
  • 已完成opensbi移植。

鳴謝


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


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂1 踩

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表