打印
[RISC-V MCU 应用开发]

juicevm-无第三方库不到5000行C语言 risc-v虚拟机

[复制链接]
3067|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
简介
https://github.com/juiceRv/JuiceVm
juice vm诞生于2020年,以实现可运行最新kernel主线的RISC-V最小虚拟机为目标而诞生的,设计之初秉承着可以在 RAM 只有 百KB 级别的平台上运行,不引入除了c99标准外的第三方依赖。

juice vm按照gcc所支持的C99标准编写,无第三方库依赖,浅显易懂,且具有方便移植的特性(可快速移植到多种主流 MCU 及支持c环境的所有平台上)。

juice vm去掉注释后展开所有的宏的代码行数仅12523行,仅36104字,足够的小巧。

Juice Vm的优点

  • 资源占用极低。
  • 跨平台、可快速移植。

使用特权

评论回复

相关帖子

沙发
stormwind123|  楼主 | 2021-6-2 11:03 | 只看该作者
Juice Vm的优点

  • 资源占用极低。
  • 跨平台、可快速移植。

Juice Vm的组成

  • 指令集:RV64IMASU.
  • 支持了M-mode,U-mode,S-mode下的mtime.
  • 超级精简的uart,只有读和写两个外设寄存器.
  • 超级精简的MMU SV39支持.
  • 支持RISC-V官方标准的异常和中断托管

Juice Vm 代码统计



使用特权

评论回复
板凳
stormwind123|  楼主 | 2021-6-2 11:05 | 只看该作者
Juice Vm的地址空间分布

虚拟机版本号起始地址大小(字节)寄存器名称说明所用宏名称
c21682d30x800000000x12C00000SRAM内部存储RV_CPU_SIM_RAM_START_ADDR RV_CPU_SIM_RAM_SIZE
c21682d30x92C000000x1UART_WRITEuart发送寄存器pdev_uart0_write_addr
c21682d30x92C000010x1UART_READuart接收寄存器pdev_uart0_read_addr
c21682d30x92C000020x1UART_STATEuart状态寄存器pdev_uart0_state_addr pdev_uart0_free_state pdev_uart0_readbusy_state
c21682d30x92C000030x8mtimemtime当前计数寄存器pdev_mtime_mtime_addr
c21682d30x92c000070x8mtimecmpmtime当前比较寄存器pdev_mtime_mtimecmp_addr

使用特权

评论回复
地板
stormwind123|  楼主 | 2021-6-2 11:07 | 只看该作者
Juice Vm下的软件移植进度

已经支持了c语言编程。
已完成freertos移植。
已完成mbedtls移植。
已完成mmu sv39测试。
已完成mtime测试。
已完成opensbi移植 传送门。
已完成rt-thread移植,感谢@熊大和@Andy Chen的支持 传送门。
已完成kernel主线5.0.0 传送门。
上传Juice Vm下的GCC toolchain 传送门。
适配 GDB 通用接口支持 TODO。
适配 RT-SMART TODO。

使用特权

评论回复
5
stormwind123|  楼主 | 2021-6-2 11:09 | 只看该作者
本帖最后由 stormwind123 于 2021-6-2 11:11 编辑

快速安装

  • UBUNTU/DEBIAN APT安装


使用特权

评论回复
6
stormwind123|  楼主 | 2021-6-2 11:13 | 只看该作者
  • CENTOS

使用特权

评论回复
7
stormwind123|  楼主 | 2021-6-2 11:14 | 只看该作者
  • WINDOW

编译中

快速上手

  • 快速上手运行Hello world 编写中
  • 运行Free rtos 编写中
  • 运行mbedtls 编写中
  • 运行SV39 MMU测试 编写中
  • 运行mtime测试 编写中
  • 运行mtime测试 编写中
  • 运行 RT-thread 编写中
  • 运行 linux kernel 编写中

使用特权

评论回复
8
stormwind123|  楼主 | 2021-6-2 11:19 | 只看该作者
运行freertos 截图




运行rt-thread 截图




运行linx 5.0.0 截图




使用特权

评论回复
9
stormwind123|  楼主 | 2021-6-2 11:20 | 只看该作者
软件参数使用说明

参数参数名称说明
tenable test mode进入固件测试模式<br>当出现下面的状态会结束运行并且打印出通过还是失败的字样,x3_gp寄存器的值为1 和 x17_a7寄存器的值为93时,进入了ecall异常就会触发。x10_a0 寄存器的值为 0时打印pass字样,否则打印fail字样
Tenable trap debug mode使能异常调试模式,出现异常时会打印当前异常的调试信息
denable debug mode打开虚拟机内所有的调试选项,输出最详细的调试信息,包括指令译码,处理执行,当前寄存器列表,csr列表等
cprint cst operation msg打开虚拟机的csr寄存器读写调试信息。读写csr寄存器的时候都会打印对应的csr寄存器的值
adiable all debug msg关闭所有调试选项,译码调试默认打开
xenable test mode for exception打开异常测试模式,当出现异常时结束运行
genable better readability printing使用可读性更好的方式打印信息
edisable all error msg关闭所有的错误信息打印
ienable all instr debug msg打开所有指令调试信息打印
menable mmu debug msg打开mmu的遍历调试信息
pprint mmu page 8 byte datahexdump打印mmu页表里的8字节数据
Pprint mmu page 4K Byte datahexdump打印mmu页表里的4K字节数据
suart addr not use mmu translation启用mmu翻译时,忽略uart的外设地址,在启用了mmu的时候也可以直接通过uart原始物理地址来操作uart外设
Sswitch mode debug info打开切换mode时的调试信息,m-mode,s-mode和u-mode切换的时候都会打印调试信息
Mdisable mmu err msg关闭mmu缺页异常,访问异常,加载异常的错误信息
renable trap debug msg打印更详细的进入中断的调试信息
Aenable addr translation debug print打印地址转换的调试打印
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)启用死循环监测机制,当有连续3次出现同样的指令执行流程(包括寄存器和csr寄存器的值都没有改变),结束虚拟机的运行。可以搭配-L参数使用,方便调试固件。一般assert都是直接死循环。

使用特权

评论回复
10
stormwind123|  楼主 | 2021-6-2 11:21 | 只看该作者
社区支持

   挖坑网首发 感谢晕哥一路的支持:https://whycan.com/t_5844.html

CHANGE LOG

2021-05-25

  • opensbi和kernel的代码已发布到github!!! https://github.com/juiceRv/kernel_juicevm_port kernel的配置文件在arch/riscv/configs/juicevm_defconfig,make ARCH=riscv juicevm_defconfig
  • 需要修改下arch/riscv/configs/juicevm_defconfig里的CONFIG_INITRAMFS_SOURCE="/mnt/ssd_prj/risc-v_sim/sim/test/opensbI/Opensbi-master/rootfs"
    修改为opensbi里的路径  

      opensbi仓库
      https://github.com/juiceRv/opensbi_juicevm_port

      toolchains
      https://github.com/juiceRv/gcc-gnu-toolchains-for-juicevm



20210524进展公布,发布包发布juice_vm_release_for_Linux_c21682d3.zip:

  • 修复了mtime在m-mode,s-mode和u-mode下的中断处理漏洞。
  • 修复了ecall在s-mode下的漏洞。
  • 修复了在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上可以正常运行的发布包,感谢@XBOOT大佬的反馈。
  • 添加了div指令支持。
  • 修复了divuw,divw,remu,remw,amomin.w,amoswap.w的指令错误。



20210427更新:





  • 提交了RT-Thread 的适配 到官方仓库:详情请点击https://github.com/RT-Thread/rt-thread/tree/master/bsp/juicevm


[color=rgb(51, 102, 153) !important]复制代码






20210424更新:

软件适配进度

1.已完成rt-thread移植。

更新了支持的参数:

  • 新增-L参数用于指定打印日志方式。
  • 新增-l参数用于在出现死循环的时候结束运行。
  • 新增-r参数用于开启trap调试打印
  • 更新了Alive **。
  • 新增-T参数用于执行过程输出反汇编调试打印。
  • 新增m模块支持。
  • 新增s-mode支持(u-mode支持中)。



202210306更新:

软件适配进度

  • 已经支持了c语言编程。
  • 已完成freertos移植。
  • 已完成mebedtls移植。
  • 已完成mmu sv39测试。
  • 已完成mtimer测试。
  • 已完成opensbi移植。

更新了支持的参数:

  • -m 参数用于开启mmu调试信息

    提交日志
  • 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语言实现一个risc-v虚拟机,带mmu

基于指令集 rv64i

实现了mtime,超级精简的uart和mmu sv39.

更新了支持的参数:

  • -a 关闭所有调试打印
  • -e 关闭错误打印
  • -g 用更好的方式来显示打印
  • -d 开启所有调试打印(包括寄存器和csr列表)
  • -i 开启指令解码调试信息
  • -m 开启mmu调试信息

软件适配进度

  • 已经支持了c语言编程。
  • 已完成freertos移植。
  • 已完成mebedtls移植。
  • 已完成mmu sv39测试。
  • 已完成mtimer测试。
  • 已完成opensbi移植。

鸣谢

  • 哇酷网
  • RT-thread
  • RISC-V
  • linux
  • gh-md-toc

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

293

主题

1191

帖子

1

粉丝