找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

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

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:930728 發(fā)表于 2021-6-1 15:57 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最后由 juicerv 于 2021-6-1 16:09 編輯



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

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

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

Juice Vm的優(yōu)點

  • 資源占用極低。
  • 跨平臺、可快速移植。

Juice Vm的組成

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

Juice Vm 代碼統(tǒng)計


Juice Vm的地址空間分布

虛擬機版本號起始地址大小(字節(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當前計數(shù)寄存器pdev_mtime_mtime_addr
c21682d30x92c000070x8mtimecmpmtime當前比較寄存器pdev_mtime_mtimecmp_addr

Juice Vm下的軟件移植進度

  • 已經(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

編譯中

快速上手


運行freertos 截圖


運行rt-thread 截圖



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


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

參數(shù)參數(shù)名稱說明
tenable test mode進入固件測試模式<br>當出現(xiàn)下面的狀態(tài)會結(jié)束運行并且打印出通過還是失敗的字樣,x3_gp寄存器的值為1 和 x17_a7寄存器的值為93時,進入了ecall異常就會觸發(fā)。x10_a0 寄存器的值為 0時打印pass字樣,否則打印fail字樣
Tenable trap debug mode使能異常調(diào)試模式,出現(xiàn)異常時會打印當前異常的調(diào)試信息
denable debug mode打開虛擬機內(nèi)所有的調(diào)試選項,輸出最詳細的調(diào)試信息,包括指令譯碼,處理執(zhí)行,當前寄存器列表,csr列表等
cprint cst operation msg打開虛擬機的csr寄存器讀寫調(diào)試信息。讀寫csr寄存器的時候都會打印對應(yīng)的csr寄存器的值
adiable all debug msg關(guān)閉所有調(diào)試選項,譯碼調(diào)試默認打開
xenable test mode for exception打開異常測試模式,當出現(xiàn)異常時結(jié)束運行
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打印更詳細的進入中斷的調(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> 選擇虛擬機輸出的方式,1,直接標準輸出。2,使用一個buf先緩存,退出的時候再輸出bug大小2900Byte。3,不輸出。<br>
lenable endless loop check (RV_ENDLESS_LOOP_CHECK_EXIT_CNT:3)啟用死循環(huán)監(jiān)測機制,當有連續(xù)3次出現(xiàn)同樣的指令執(zhí)行流程(包括寄存器和csr寄存器的值都沒有改變),結(jié)束虛擬機的運行?梢源钆-L參數(shù)使用,方便調(diào)試固件。一般assert都是直接死循環(huán)。

社區(qū)支持

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

CHANGE LOG

2021-05-25




20210524進展公布,發(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下進入異常模式,更新csr寄存器的漏洞。
  • 移植了linux。  

    juice_vm成功運行kernel主線5.0.0。
    juice_vm成功運行kernel主線5.0.0。
    juice_vm成功運行kernel主線5.0.0。



20210508更新:

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



20210427更新:

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



20210424更新:

軟件適配進度

1.已完成rt-thread移植。

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

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



202210306更新:

軟件適配進度

  • 已經(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語言實現(xiàn)一個risc-v虛擬機,帶mmu

基于指令集 rv64i

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

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

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

軟件適配進度

  • 已經(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ù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

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