您尚未登录。

楼主 #1 2021-01-11 17:12:11

xiaohui
会员
注册时间: 2019-01-15
已发帖子: 224
积分: 172

[juicevm] 只需要不到5000行代码实现一个risc-v虚拟机,纯c语言实现,无第三方库,支持ESP32 & GDB

基于指令集 rv64i
实现了mtime,超级精简的uart和mmu sv39.
支持的参数:
-a 关闭所有调试打印
-e 关闭错误打印
-g 用更好的方式来显示打印
-d 开启所有调试打印(包括寄存器和csr列表)

QQ图片20210111171052.png

juice_vm_release_for_Linux_and_win_0420de4b.zip



以下 2021-03-06 更新:
--------------------------------
无第三方库不到5000行C语言实现一个risc-v虚拟机,带mmu
基于指令集 rv64i
实现了mtime,超级精简的uart和mmu sv39.
支持的参数:
-a 关闭所有调试打印
-e 关闭错误打印
-g 用更好的方式来显示打印
-d 开启所有调试打印(包括寄存器和csr列表)
-i 开启指令解码调试信息
-m 开启mmu调试信息
1. 已经支持了c语言编程。
2. 已完成freertos移植。
3. 已完成mebedtls移植。
4. 已完成mmu sv39测试。
5. 已完成mtimer测试。
6. 已完成opensbi移植。

最近编辑记录 xiaohui (2021-01-11 17:28:18)

离线

#2 2021-01-11 17:12:56

光头程序员
会员
注册时间: 2020-03-03
已发帖子: 14
积分: 14

Re: [juicevm] 只需要不到5000行代码实现一个risc-v虚拟机,纯c语言实现,无第三方库,支持ESP32 & GDB

牛皮, 强势围观!

离线

楼主 #3 2021-01-11 17:33:45

xiaohui
会员
注册时间: 2019-01-15
已发帖子: 224
积分: 172

Re: [juicevm] 只需要不到5000行代码实现一个risc-v虚拟机,纯c语言实现,无第三方库,支持ESP32 & GDB

附上之前的freertos移植流程,传送门:https://whycan.com/t_5766.html

离线

楼主 #4 2021-01-11 17:42:24

xiaohui
会员
注册时间: 2019-01-15
已发帖子: 224
积分: 172

Re: [juicevm] 只需要不到5000行代码实现一个risc-v虚拟机,纯c语言实现,无第三方库,支持ESP32 & GDB

例子里的rv_config.h忘记上传了,里面的内容就是

#define RV_CPU_SIM_RAM_START_ADDR   0
#define RV_CPU_SIM_RAM_SIZE         10 * RAM_SIZE_MB

离线

楼主 #5 2021-01-11 17:58:17

xiaohui
会员
注册时间: 2019-01-15
已发帖子: 224
积分: 172

Re: [juicevm] 只需要不到5000行代码实现一个risc-v虚拟机,纯c语言实现,无第三方库,支持ESP32 & GDB

测试例程所用的编译器下载链接,传送门:https://www.sifive.com/software#GCC

最近编辑记录 xiaohui (2021-01-11 18:03:22)

离线

#6 2021-01-13 15:09:16

assert
会员
注册时间: 2018-06-13
已发帖子: 54
积分: 54

Re: [juicevm] 只需要不到5000行代码实现一个risc-v虚拟机,纯c语言实现,无第三方库,支持ESP32 & GDB

来了来了 给大佬点赞来了

离线

楼主 #7 2021-01-14 17:29:50

xiaohui
会员
注册时间: 2019-01-15
已发帖子: 224
积分: 172

Re: [juicevm] 只需要不到5000行代码实现一个risc-v虚拟机,纯c语言实现,无第三方库,支持ESP32 & GDB

assert 说:

来了来了 给大佬点赞来了

谢谢大佬围观

离线

楼主 #8 2021-01-19 18:07:08

xiaohui
会员
注册时间: 2019-01-15
已发帖子: 224
积分: 172

Re: [juicevm] 只需要不到5000行代码实现一个risc-v虚拟机,纯c语言实现,无第三方库,支持ESP32 & GDB

更新,发布安卓版本的可执行文件:juice_vm_android_0420de4b.zip

这个发布包里没有包含测试例子,测试例子使用本帖一楼的测试即可。

最近编辑记录 xiaohui (2021-01-19 18:07:46)

离线

楼主 #9 2021-03-06 17:52:58

xiaohui
会员
注册时间: 2019-01-15
已发帖子: 224
积分: 172

Re: [juicevm] 只需要不到5000行代码实现一个risc-v虚拟机,纯c语言实现,无第三方库,支持ESP32 & GDB

juice_vm_release_for_Win64_f041c8a2.zip
202210306更新:
1. 已经支持了c语言编程。
2. 已完成freertos移植。
3. 已完成mebedtls移植。
4. 已完成mmu sv39测试。
5. 已完成mtimer测试。
6. 已完成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

最近编辑记录 xiaohui (2021-03-06 18:54:19)

离线

楼主 #10 2021-03-06 18:08:16

xiaohui
会员
注册时间: 2019-01-15
已发帖子: 224
积分: 172

Re: [juicevm] 只需要不到5000行代码实现一个risc-v虚拟机,纯c语言实现,无第三方库,支持ESP32 & GDB

运行freertos的截图:
_20210306180737.png

离线

#11 2021-03-06 19:25:05

aozima
会员
所在地: 深圳
注册时间: 2019-05-25
已发帖子: 261
积分: 174.5
个人网站

Re: [juicevm] 只需要不到5000行代码实现一个risc-v虚拟机,纯c语言实现,无第三方库,支持ESP32 & GDB

楼主高产

离线

#12 2021-03-07 00:55:00

微凉VeiLiang
会员
所在地: 深圳
注册时间: 2018-10-28
已发帖子: 543
积分: 485
个人网站

Re: [juicevm] 只需要不到5000行代码实现一个risc-v虚拟机,纯c语言实现,无第三方库,支持ESP32 & GDB

厉害,是个好东西

离线

#13 2021-03-07 15:14:19

novice
会员
注册时间: 2019-07-26
已发帖子: 61
积分: 48.5

Re: [juicevm] 只需要不到5000行代码实现一个risc-v虚拟机,纯c语言实现,无第三方库,支持ESP32 & GDB

貌似没有源代码,都是编译后的二进制执行文件。

离线

楼主 #14 2021-04-23 18:00:01

xiaohui
会员
注册时间: 2019-01-15
已发帖子: 224
积分: 172

Re: [juicevm] 只需要不到5000行代码实现一个risc-v虚拟机,纯c语言实现,无第三方库,支持ESP32 & GDB

juice_vm_release_for_Linux_57ba985a.zip
20210424更新:
1. 已完成rt-thread移植。
2.新增-L参数用于指定打印日志方式。
3.新增-l参数用于在出现死循环的时候结束运行。
4.新增-r参数用于开启trap调试打印
5.更新了Alive logo。
6.新增-T参数用于执行过程输出反汇编调试打印。
7.新增m模块支持。
8.新增s-mode支持(u-mode支持中)。
juicevm_rtt.jpg

最近编辑记录 xiaohui (2021-04-23 18:18:46)

离线

#15 2021-04-23 19:02:40

qianhao
会员
注册时间: 2017-12-14
已发帖子: 132
积分: 126

Re: [juicevm] 只需要不到5000行代码实现一个risc-v虚拟机,纯c语言实现,无第三方库,支持ESP32 & GDB

牛逼了 围观一下,我对这个riscv也是比较有兴趣的

离线

#16 2021-04-23 21:47:50

zuoyi
会员
注册时间: 2018-05-29
已发帖子: 10
积分: 9.5

Re: [juicevm] 只需要不到5000行代码实现一个risc-v虚拟机,纯c语言实现,无第三方库,支持ESP32 & GDB

厉害(20210424更新?我穿越了?

离线

楼主 #17 2021-04-27 13:56:43

xiaohui
会员
注册时间: 2019-01-15
已发帖子: 224
积分: 172

Re: [juicevm] 只需要不到5000行代码实现一个risc-v虚拟机,纯c语言实现,无第三方库,支持ESP32 & GDB

zuoyi 说:

厉害(20210424更新?我穿越了?

哈哈,是的,欢迎来到未来。

离线

楼主 #18 2021-04-27 14:03:35

xiaohui
会员
注册时间: 2019-01-15
已发帖子: 224
积分: 172

Re: [juicevm] 只需要不到5000行代码实现一个risc-v虚拟机,纯c语言实现,无第三方库,支持ESP32 & GDB

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

离线

#19 2021-04-27 22:37:30

aozima
会员
所在地: 深圳
注册时间: 2019-05-25
已发帖子: 261
积分: 174.5
个人网站

Re: [juicevm] 只需要不到5000行代码实现一个risc-v虚拟机,纯c语言实现,无第三方库,支持ESP32 & GDB

用来学习risc-v指令真不错

离线

楼主 #20 2021-05-07 18:44:21

xiaohui
会员
注册时间: 2019-01-15
已发帖子: 224
积分: 172

Re: [juicevm] 只需要不到5000行代码实现一个risc-v虚拟机,纯c语言实现,无第三方库,支持ESP32 & GDB

global_vm_log_init output_mode_sel: 0  JUICE_VM_LOG_MAX_NUM:2900
      gg ,ggg,         gg      ,a8a,     ,gggg,   ,ggggggg, ,ggg,         ,g,ggg, ,ggg,_,ggg,  
     dP8dP  Y8a        88     ,8   8,  ,88   Y8b,dP      Y8dP  Y8a       ,8dP  Y8dP  Y88P  Y8b 
    dP YYb, `88        88     d8   8b d8      `Yd8'    a  YYb, `88       d8Yb, `88'  `88'  `88 
   ,8  `8`   88        88     88   88d8'   8b  d88      Y8P'`   88       88 `   88    88    88 
   I8   Yb   88        88     88   8,8I     Y88P`8baaaa         88       88     88    88    88 
   `8b, `8,  88        88     Y8   8I8'        ,d8P             I8       8I     88    88    88 
    ` Y88888 88        88     `8, ,8d8         d8               `8,     ,8'     88    88    88 
         Y8  88        888888   8,8 Y8,        Y8,               Y8,   ,8P      88    88    88 
         ,88,Y8b,____,d88`8b,  ,d8b,`Yba,,_____`Yba,,_____,       Yb,_,dP       88    88    Y8,
     ,ad88888  Y888888P Y8  Y88P   Y8 ` Y8888888 ` Y8888888         Y8P         88    88    `Y8
   ,dP '   Yb                                                                                  
  ,8'      I8                                                                                  
 ,8'       I8                                                                                  
 I8,      ,8'                                                                                  
 `Y8,___,d8'                                                                                   
    Y888P                                                                                      
 email:                                                                       juicemail@163.com
version:f259ffe5 f259ffe5 Fri, 7 May 2021 16:31:18 +0800 xiaoxiaohuixxh feat(vm): pass ui ua si test but lrsc and scr test
firm_addr:build/platform/juice/juiceRv/firmware/fw_payload.bin
fd = 3
file_size = 6169144
interrupt_vertor_register_mag_init
rv_csr_register_init
csr_addr_misa 8000000000040101
csr_addr_mvendorid 0000000000000000
csr_addr_marchid 0000000000000000
csr_addr_mimpid 0000000000000000
csr_addr_mhartid 0000000000000000
rv_peripheral_device_init
[rv64_sim][dev][mmu]rv.c(6114):rv_peripheral_device_mmu_init,Sv39 mode support only
[rv64_sim][dev][mtime]rv.c(5773):rv_peripheral_device_mtime_init
[rv64_sim][dev][mtime]rv.c(5792):pdev_mtime_irq_info 0x55f859de9110 92c00003 92c00007
[rv64_sim][proc][err]rv.c[interrupt_vertor_register](1910){pc:0000000000000000}:interrupt_vertor_register err->irq info err irq_v 1 addr_min 4
[rv64_sim][dev][mtime]rv.c(5803):pdev_mtime_irq_info_on_umode (nil) 92c00003 92c00007
[rv64_sim][dev][uart0]rv.c(5580):rv_peripheral_device_uart0_init
[rv64_sim][dev][uart0]rv.c(5596):pdev_uart0_irq_info 0x55f859de90f0
rv sim start...loading
cpu run...
[juiceRv]set_rv_scr csr_addr 0000000000000180(csr_addr_satp) new_v 0000000000000000
get_MODE_xsatp(get_rv_csr(csr_addr_satp)) 0

OpenSBI v0.9
   ____                    _____ ____ _____
  / __ \                  / ____|  _ \_   _|
 | |  | |_ __   ___ _ __ | (___ | |_) || |
 | |  | | '_ \ / _ \ '_ \ \___ \|  _ < | |
 | |__| | |_) |  __/ | | |____) | |_) || |_
  \____/| .__/ \___|_| |_|_____/|____/_____|
        | |
        |_|

Platform Name             : juice-JuiceRv
Platform Features         : timer,mfdeleg
Platform HART Count       : 1
Firmware Base             : 0x80000000
Firmware Size             : 80 KB
Runtime SBI Version       : 0.3

Domain0 Name              : root
Domain0 Boot HART         : 0
Domain0 HARTs             : 0*
Domain0 Region00          : 0x0000000080000000-0x000000008001ffff ()
Domain0 Region01          : 0x0000000000000000-0xffffffffffffffff (R,W,X)
Domain0 Next Address      : 0x0000000080200000
Domain0 Next Arg1         : 0x0000000082200000
Domain0 Next Mode         : S-mode
Domain0 SysReset          : yes

Boot HART ID              : 0
Boot HART Domain          : root
Boot HART ISA             : rv64ias
Boot HART Features        : scounteren,mcounteren,time
Boot HART PMP Count       : 64
Boot HART PMP Granularity : 4
Boot HART PMP Address Bits: 54
Boot HART MHPM Count      : 29
Boot HART MHPM Count      : 29
Boot HART MIDELEG         : 0x0000000000000222
Boot HART MEDELEG         : 0x000000000000b109
[juiceRv]set_rv_scr csr_addr 0000000000000105(csr_addr_stvec) new_v 0000000080200000
[juiceRv]set_rv_scr csr_addr 0000000000000180(csr_addr_satp) new_v 0000000000000000
get_MODE_xsatp(get_rv_csr(csr_addr_satp)) 0
H
D
C
B
M
S
R
R1[juiceRv]set_rv_scr csr_addr 0000000000000105(csr_addr_stvec) new_v ffffffff800003a4
23[juiceRv]set_rv_scr csr_addr 0000000000000180(csr_addr_satp) new_v 800000000008021c
get_MODE_xsatp(get_rv_csr(csr_addr_satp)) 8
[rv64_sim][dev][mmu][err]rv.c(6220):V:0 R:0 W:0
[rv64_sim][dev][mmu][err]rv.c(6221):如果pte.v = 0,或者pte.r = 0且pte.w = 1,则停止并引发与原始访问类型相对应的页面错误异常。
[rv64_sim][dev][mmu][err]rv.c(6305):rv_peripheral_device_mmu_translation pc:0000000080200394 va 0000000080200394 pa 0000000000000000
[rv64_sim][proc][err]rv.c[RISCVTrap](1404){pc:0000000080200394}:RV_exception_Instruction_page_fault va 0000000080200394
[rv64_sim][dev][mmu][err]rv.c(6317):this addr not found
5
[juiceRv]set_rv_scr csr_addr 0000000000000105(csr_addr_stvec) new_v ffffffff800003f0
6[juiceRv]set_rv_scr csr_addr 0000000000000180(csr_addr_satp) new_v 80000000000805a7
get_MODE_xsatp(get_rv_csr(csr_addr_satp)) 8
I
Parse_dtb
start_kernel
[    0.000000] OF: fdt: Ignoring memory range 0x80000000 - 0x80200000
[    0.000000] memblock_add enter
[    0.000000] No DTB passed to the kernel
[    0.000000] func start_kernel ( 647 )
[    0.000000] func start_kernel ( 651 )
[    0.000000] func start_kernel ( 653 )
[    0.000000] func start_kernel ( 656 )
[    0.000000] func start_kernel ( 659 )
[    0.000000] func start_kernel ( 661 )
[    0.000000] func start_kernel ( 668 )
[    0.000000] func start_kernel ( 670 )
[    0.000000] Linux version 5.0.0-g1e922e1de (xiaohui@DESKTOP-7HFR7VO) (gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)) #51 Mon Mar 29 01:40:29 CST 2021
[    0.000000] func start_kernel ( 672 )
[    0.000000] earlycon: sbi0 at I/O port 0x0 (options '')
[    0.000000] printk: bootconsole [sbi0] enabled
[    0.000000] 
[    0.000000]  reg->base: 80200000 reg->size: e00000
[    0.000000] 
[    0.000000] mem_size: 0000000000e00000
[    0.000000] 
[    0.000000] memblock_end_of_DRAM end addr: ffffffff800e269c
[    0.000000] initrd not found or empty - disabling initrd
[    0.000000] 
[    0.000000] memblock_dump_all end addr: ffffffff800217bc
[    0.000000] Zone ranges:
[    0.000000]   DMA32    [mem 0x0000000080200000-0x0000000080ffffff]
[    0.000000]   Normal   empty
[    0.000000] Movable zone start for each node
[    0.000000] Early memory node ranges
[    0.000000]   node   0: [mem 0x0000000080200000-0x0000000080ffffff]
[    0.000000] Initmem setup node 0 [mem 0x0000000080200000-0x0000000080ffffff]
[    0.000000] On node 0 totalpages: 3584
[    0.000000] memblock_alloc_try_nid_nopanic: 229376 bytes align=0x40 nid=0 from=0x0000000000000000 max_addr=0x0000000000000000 alloc_node_mem_map.constprop.34+0x70/0xc0
[    0.000000]   DMA32 zone: 49 pages used for memmap
[    0.000000]   DMA32 zone: 0 pages reserved
[    0.000000]   DMA32 zone: 3584 pages, LIFO batch:0
[    0.000000] memblock_alloc_try_nid_nopanic: 8 bytes align=0x40 nid=0 from=0x0000000000000000 max_addr=0x0000000000000000 setup_usemap.isra.8+0x5c/0x78
[    0.000000] memblock_alloc_try_nid: 2740 bytes align=0x8 nid=-1 from=0x0000000000000000 max_addr=0x0000000000000000 early_init_dt_alloc_memory_arch+0x20/0x30
[    0.000000] memblock_alloc_try_nid_nopanic: 67108864 bytes align=0x1000 nid=-1 from=0x0000000000000000 max_addr=0x00000000ffffffff swiotlb_init+0x64/0xd8
[    0.000000] software IO TLB: Cannot allocate buffer
[    0.000000] elf_hwcap is 0x1101
[    0.000000] func start_kernel ( 696 )
[    0.000000] func start_kernel ( 702 )
[    0.000000] func start_kernel ( 704 )
[    0.000000] func start_kernel ( 706 )
[    0.000000] func start_kernel ( 708 )
[    0.000000] memblock_alloc_try_nid: 67 bytes align=0x40 nid=-1 from=0x0000000000000000 max_addr=0x0000000000000000 start_kernel+0x1fc/0xcc8
[    0.000000] memblock_alloc_try_nid: 67 bytes align=0x40 nid=-1 from=0x0000000000000000 max_addr=0x0000000000000000 start_kernel+0x228/0xcc8
[    0.000000] memblock_alloc_try_nid: 67 bytes align=0x40 nid=-1 from=0x0000000000000000 max_addr=0x0000000000000000 start_kernel+0x250/0xcc8
[    0.000000] func start_kernel ( 710 )
[    0.000000] func start_kernel ( 712 )
[    0.000000] memblock_alloc_try_nid_nopanic: 4096 bytes align=0x1000 nid=-1 from=0x0000000000000000 max_addr=0x0000000000000000 pcpu_alloc_alloc_info+0x68/0xc4
[    0.000000] memblock_alloc_try_nid_nopanic: 32768 bytes align=0x1000 nid=-1 from=0x0000000080200000 max_addr=0x0000000000000000 setup_per_cpu_areas+0x48/0xb8
[    0.000000] memblock_alloc_try_nid: 8 bytes align=0x40 nid=-1 from=0x0000000000000000 max_addr=0x0000000000000000 pcpu_setup_first_chunk+0x394/0x78c
[    0.000000] memblock_alloc_try_nid: 8 bytes align=0x40 nid=-1 from=0x0000000000000000 max_addr=0x0000000000000000 pcpu_setup_first_chunk+0x3b4/0x78c
[    0.000000] memblock_alloc_try_nid: 4 bytes align=0x40 nid=-1 from=0x0000000000000000 max_addr=0x0000000000000000 pcpu_setup_first_chunk+0x3d0/0x78c
[    0.000000] memblock_alloc_try_nid: 8 bytes align=0x40 nid=-1 from=0x0000000000000000 max_addr=0x0000000000000000 pcpu_setup_first_chunk+0x3ec/0x78c
rs1 >= 0 && rs2 >= 0rs1 >= 0 && rs2 >= 0rs1 >= 0 && rs2 >= 0[    0.000000] pcpu-alloc: s0 r0 d32768 u32768 alloc=1*32768
[    0.000000] pcpu-alloc: [0] 0 
[    0.000000] memblock_alloc_try_nid: 240 bytes align=0x40 nid=-1 from=0x0000000000000000 max_addr=0x0000000000000000 pcpu_setup_first_chunk+0x69c/0x78c
[    0.000000] memblock_alloc_try_nid: 105 bytes align=0x40 nid=-1 from=0x0000000000000000 max_addr=0x0000000000000000 pcpu_alloc_first_chunk+0x98/0x314
[    0.000000] memblock_alloc_try_nid: 1024 bytes align=0x40 nid=-1 from=0x0000000000000000 max_addr=0x0000000000000000 pcpu_alloc_first_chunk+0xd8/0x314
[    0.000000] memblock_alloc_try_nid: 1032 bytes align=0x40 nid=-1 from=0x0000000000000000 max_addr=0x0000000000000000 pcpu_alloc_first_chunk+0x100/0x314
[    0.000000] memblock_alloc_try_nid: 160 bytes align=0x40 nid=-1 from=0x0000000000000000 max_addr=0x0000000000000000 pcpu_alloc_first_chunk+0x124/0x314
rs1 <= 0 && rs2 >= 0rs1 >= 0 && rs2 >= 0[    0.000000]    memblock_free: [0x0000000080fc6000-0x0000000080fc6fff] pcpu_free_alloc_info+0x24/0x34
[    0.000000] func start_kernel ( 714 )
[    0.000000] func start_kernel ( 716 )
[    0.000000] func start_kernel ( 718 )
[    0.000000] Built 1 zonelists, mobility grouping off.  Total pages: 3535
[    0.000000] func start_kernel ( 721 )
[    0.000000] func start_kernel ( 723 )
[    0.000000] Kernel command line: console=hvc0 earlycon=sbi console=hvc0 earlycon=sbi memblock=debug
[    0.000000] func start_kernel ( 726 )
[    0.000000] func start_kernel ( 728 )
[    0.000000] func start_kernel ( 733 )
[    0.000000] func start_kernel ( 737 )
[    0.000000] func start_kernel ( 740 )
[    0.000000] func start_kernel ( 747 )
[    0.000000] memblock_alloc_try_nid_nopanic: 16384 bytes align=0x40 nid=-1 from=0x0000000000000000 max_addr=0x0000000000000000 alloc_large_system_hash+0x2c4/0x4c0
[    0.000000] Dentry cache hash table entries: 2048 (order: 2, 16384 bytes)
[    0.000000] memblock_alloc_try_nid_nopanic: 8192 bytes align=0x40 nid=-1 from=0x0000000000000000 max_addr=0x0000000000000000 alloc_large_system_hash+0x2c4/0x4c0
[    0.000000] Inode-cache hash table entries: 1024 (order: 1, 8192 bytes)
[    0.000000] func start_kernel ( 749 )
[    0.000000] Sorting __ex_table...
[    0.000000] func start_kernel ( 751 )
[juiceRv]set_rv_scr csr_addr 0000000000000105(csr_addr_stvec) new_v ffffffff80020e54
[    0.000000] func start_kernel ( 753 )
[    0.000000] func mm_init ( 621 )
[    0.000000] Memory: 10068K/14336K available (2794K kernel code, 181K rwdata, 620K rodata, 128K init, 240K bss, 4268K reserved, 0K cma-reserved)
[    0.000000] func mm_init ( 623 )
[rv64_sim][dev][mmu][err]rv.c(6220):V:0 R:0 W:0
[rv64_sim][dev][mmu][err]rv.c(6221):如果pte.v = 0,或者pte.r = 0且pte.w = 1,则停止并引发与原始访问类型相对应的页面错误异常。
[rv64_sim][dev][mmu][err]rv.c(6305):rv_peripheral_device_mmu_translation pc:ffffffff800b3004 va 000000017fc861df pa 0000000080579c10
[rv64_sim][proc][err]rv.c[RISCVTrap](1456){pc:ffffffff800b3004}:RV_exception_Load_page_fault va 000000017fc861df
[rv64_sim][dev][mmu][err]rv.c(6317):this addr not found
[    0.000000] Unable to handle kernel paging request at virtual address 000000017fc861df
[    0.000000] Oops [#1]
[    0.000000] CPU: 0 PID: 0 Comm: swapper Not tainted 5.0.0-g1e922e1de #51
[    0.000000] sepc: ffffffff800b3004 ra : ffffffff800b3004 sp : ffffffff80379c20
[    0.000000]  gp : ffffffff803a3178 tp : ffffffff80382418 t0 : 0000000000008000
[    0.000000]  t1 : 0000000000000000 t2 : 0000000000000000 s0 : 000000017fc862ef
[    0.000000]  s1 : ffffffff80391468 a0 : 0000000000000000 a1 : ffffffff80de4008
[    0.000000]  a2 : 0000000000000001 a3 : 0000000000000000 a4 : 0000000000000000
[    0.000000]  a5 : ffffffffffffff01 a6 : 00000000000000ff a7 : 0000000000000000
[    0.000000]  s2 : 0000000000000000 s3 : 0000000000000000 s4 : ffffffff80391458
[    0.000000]  s5 : ffffffff8039fdf0 s6 : 000000007fc60188 s7 : 0000000000000001
[    0.000000]  s8 : 0000000000000001 s9 : 0000000000000000 s10: 0000000000000088
[    0.000000]  s11: 00000000003fffff t3 : ffffffff8039fe78 t4 : 0000000000000001
[    0.000000]  t5 : ffffffff8039fe78 t6 : c000000000000000
[    0.000000] sstatus: 0000000000000000 sbadaddr: 000000017fc861df scause: 000000000000000d
[    0.000000] random: get_random_bytes called from print_oops_end_marker+0x58/0x7c with crng_init=0
[    0.000000] ---[ end trace c955a8d686188788 ]---
[    0.000000] Kernel panic - not syncing: Attempted to kill the idle task!
[    0.000000] ---[ end Kernel panic - not syncing: Attempted to kill the idle task! ]---
oops! stop!!!
------------------------global_vm_log_output global_vm_log_pos:0------------------------

最新进度,linux kernel还是没跑起来

离线

#21 2021-05-07 19:35:47

kekemuyu
会员
注册时间: 2018-12-13
已发帖子: 712
积分: 668.5

Re: [juicevm] 只需要不到5000行代码实现一个risc-v虚拟机,纯c语言实现,无第三方库,支持ESP32 & GDB

bellard的riscv&x86模拟器
https://bellard.org/tinyemu/

离线

楼主 #22 2021-05-08 10:55:19

xiaohui
会员
注册时间: 2019-01-15
已发帖子: 224
积分: 172

Re: [juicevm] 只需要不到5000行代码实现一个risc-v虚拟机,纯c语言实现,无第三方库,支持ESP32 & GDB

kekemuyu 说:

bellard的riscv&x86模拟器
https://bellard.org/tinyemu/

谢谢大佬分享,一直也有关注这个天才大佬的项目。

离线

楼主 #23 2021-05-08 15:59:40

xiaohui
会员
注册时间: 2019-01-15
已发帖子: 224
积分: 172

Re: [juicevm] 只需要不到5000行代码实现一个risc-v虚拟机,纯c语言实现,无第三方库,支持ESP32 & GDB

20210508更新:
1,上传一个ubuntu20.04上可以正常运行的发布包,感谢@XBOOT大佬的反馈。
2,添加了div指令支持。
3,修复了divuw,divw,remu,remw,amomin.w,amoswap.w的指令错误。
juice_vm_for_Linux_b58244f3.zip

最近编辑记录 xiaohui (2021-05-08 16:01:15)

离线

#24 2021-05-08 17:51:08

xboot
会员
注册时间: 2019-10-15
已发帖子: 370
积分: 270

Re: [juicevm] 只需要不到5000行代码实现一个risc-v虚拟机,纯c语言实现,无第三方库,支持ESP32 & GDB

退出时,恢复一下终端的状态吧,看不到光标了,还有参数选项解释可以详细点,现在不知道怎么传参

离线

#25 2021-05-08 18:24:27

novice
会员
注册时间: 2019-07-26
已发帖子: 61
积分: 48.5

Re: [juicevm] 只需要不到5000行代码实现一个risc-v虚拟机,纯c语言实现,无第三方库,支持ESP32 & GDB

kekemuyu 说:

bellard的riscv&x86模拟器
https://bellard.org/tinyemu/

下了,1M大小,支持X86和RISC-V,还可以json配置。不错,正在学习。

离线

#26 2021-05-14 09:02:58

ma6254
会员
注册时间: 2019-11-03
已发帖子: 39
积分: 37

Re: [juicevm] 只需要不到5000行代码实现一个risc-v虚拟机,纯c语言实现,无第三方库,支持ESP32 & GDB

可以gdb调试吗?

离线

#27 2021-05-14 09:19:59

raspberryman
会员
注册时间: 2019-12-27
已发帖子: 502
积分: 464.5

Re: [juicevm] 只需要不到5000行代码实现一个risc-v虚拟机,纯c语言实现,无第三方库,支持ESP32 & GDB

kekemuyu 说:

bellard的riscv&x86模拟器
https://bellard.org/tinyemu/

https://github.com/franzflasch/riscv_em  RISCV模拟器

离线

楼主 #28 2021-05-24 18:43:18

xiaohui
会员
注册时间: 2019-01-15
已发帖子: 224
积分: 172

Re: [juicevm] 只需要不到5000行代码实现一个risc-v虚拟机,纯c语言实现,无第三方库,支持ESP32 & GDB

20210524进展公布(发行包还在整理中):
1,修复了mtime在m-mode,s-mode和u-mode下的中断处理漏洞。
2,修复了ecall在s-mode下的漏洞。
3,修复了在s-mode和u-mode下进入异常模式,更新csr寄存器的漏洞。
4,移植了linux。
juice_vm成功运行kernel主线5.0.0。
juice_vm成功运行kernel主线5.0.0。
juice_vm成功运行kernel主线5.0.0。
052416041554_01(1).png

离线

#29 2021-05-24 22:56:54

pkoko
会员
注册时间: 2020-04-29
已发帖子: 17
积分: 17

Re: [juicevm] 只需要不到5000行代码实现一个risc-v虚拟机,纯c语言实现,无第三方库,支持ESP32 & GDB

该评论内容与本帖子无关,鼓励各位坑友积极发言讨论与帖子有关的内容!

离线

  • 不通过:与技术无关

楼主 #30 2021-05-25 00:42:04

xiaohui
会员
注册时间: 2019-01-15
已发帖子: 224
积分: 172

Re: [juicevm] 只需要不到5000行代码实现一个risc-v虚拟机,纯c语言实现,无第三方库,支持ESP32 & GDB

20210524进展公布,发布包发布juice_vm_release_for_Linux_c21682d3.zip
1,修复了mtime在m-mode,s-mode和u-mode下的中断处理漏洞。
2,修复了ecall在s-mode下的漏洞。
3,修复了在s-mode和u-mode下进入异常模式,更新csr寄存器的漏洞。
4,移植了linux。
juice_vm成功运行kernel主线5.0.0。
juice_vm成功运行kernel主线5.0.0。
juice_vm成功运行kernel主线5.0.0。

离线

楼主 #31 2021-05-25 13:39:45

xiaohui
会员
注册时间: 2019-01-15
已发帖子: 224
积分: 172

Re: [juicevm] 只需要不到5000行代码实现一个risc-v虚拟机,纯c语言实现,无第三方库,支持ESP32 & GDB

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

最近编辑记录 xiaohui (2021-05-25 19:18:44)

离线

楼主 #32 2021-05-26 14:49:28

xiaohui
会员
注册时间: 2019-01-15
已发帖子: 224
积分: 172

Re: [juicevm] 只需要不到5000行代码实现一个risc-v虚拟机,纯c语言实现,无第三方库,支持ESP32 & GDB

分享下软件的参数说明:
t: enable test mode
进入固件测试模式
当出现下面的状态会结束运行并且打印出通过还是失败的字样
x3_gp寄存器的值为1 和 x17_a7寄存器的值为93时,进入了ecall异常就会触发。x10_a0 寄存器的值为 0时打印pass字样,否则打印fail字样
-------------------------------------------------------------------------------
T: enable trap debug mode
使能异常调试模式,出现异常时会打印当前异常的调试信息
-------------------------------------------------------------------------------
d: enable debug mode
打开虚拟机内所有的调试选项,输出最详细的调试信息,包括指令译码,处理执行,当前寄存器列表,csr列表等
-------------------------------------------------------------------------------
c: print cst operation msg
打开虚拟机的csr寄存器读写调试信息。读写csr寄存器的时候都会打印对应的csr寄存器的值
-------------------------------------------------------------------------------
a: diable all debug msg
关闭所有调试选项,译码调试默认打开
-------------------------------------------------------------------------------
x: enable test mode for exception
打开异常测试模式,当出现异常时结束运行
-------------------------------------------------------------------------------
g: enable better readability printing
使用可读性更好的方式打印信息
-------------------------------------------------------------------------------
e: disable all error msg
关闭所有的错误信息打印
-------------------------------------------------------------------------------
i: enable all instr debug msg
打开所有指令调试信息打印
-------------------------------------------------------------------------------
m: enable mmu debug msg
打开mmu的遍历调试信息
-------------------------------------------------------------------------------
p: print mmu page 8 byte data
hexdump打印mmu页表里的8字节数据
-------------------------------------------------------------------------------
P: print mmu page 4K Byte data
hexdump打印mmu页表里的4K字节数据
-------------------------------------------------------------------------------
s: uart addr not use mmu translation
启用mmu翻译时,忽略uart的外设地址,在启用了mmu的时候也可以直接通过uart原始物理地址来操作uart外设
-------------------------------------------------------------------------------
S: switch mode debug info
打开切换mode时的调试信息,m-mode,s-mode和u-mode切换的时候都会打印调试信息
-------------------------------------------------------------------------------
M: disable mmu err msg
关闭mmu缺页异常,访问异常,加载异常的错误信息
-------------------------------------------------------------------------------
r: enable trap debug msg
打印更详细的进入中断的调试信息
-------------------------------------------------------------------------------
A: enable addr translation debug print
打印地址转换的调试打印
-------------------------------------------------------------------------------
L(n): output_mode_sel n = 0 -> stdout
                          1 -> log_buf UNIX SYS ONLY(buf_size:(2900))
                          2 -> none
选择虚拟机输出的方式,1,直接标准输出。2,使用一个buf先缓存,退出的时候再输出bug大小2900Byte。3,不输出。
-------------------------------------------------------------------------------
l: enable endless loop check (RV_ENDLESS_LOOP_CHECK_EXIT_CNT:(3))
启用死循环监测机制,当有连续3次出现同样的指令执行流程(包括寄存器和csr寄存器的值都没有改变),结束虚拟机的运行。可以搭配-L参数使用,方便调试固件。一般assert都是直接死循环。
-------------------------------------------------------------------------------

离线

#33 2021-05-26 15:51:15

aozima
会员
所在地: 深圳
注册时间: 2019-05-25
已发帖子: 261
积分: 174.5
个人网站

Re: [juicevm] 只需要不到5000行代码实现一个risc-v虚拟机,纯c语言实现,无第三方库,支持ESP32 & GDB

>死循环监测机制

这个不错!

离线

楼主 #34 2021-05-27 02:22:14

xiaohui
会员
注册时间: 2019-01-15
已发帖子: 224
积分: 172

Re: [juicevm] 只需要不到5000行代码实现一个risc-v虚拟机,纯c语言实现,无第三方库,支持ESP32 & GDB

更新私有软件源:
echo "deb http://xiaohui.mongoyun.com:3333/ trusty main" | sudo tee -a /etc/apt/sources.list
wget -O - http://xiaohui.mongoyun.com:3333/key/deb.gpg.key | sudo apt-key add -
sudo apt update
sudo apt install juicevm

离线

楼主 #35 2021-05-31 12:03:22

xiaohui
会员
注册时间: 2019-01-15
已发帖子: 224
积分: 172

Re: [juicevm] 只需要不到5000行代码实现一个risc-v虚拟机,纯c语言实现,无第三方库,支持ESP32 & GDB

xboot 说:

退出时,恢复一下终端的状态吧,看不到光标了,还有参数选项解释可以详细点,现在不知道怎么传参

这个问题还有出现吗?我在发布前已经修复了这个问题的。

离线

#36 2021-06-04 16:42:16

mini_uc
会员
注册时间: 2020-03-05
已发帖子: 11
积分: 4.5

Re: [juicevm] 只需要不到5000行代码实现一个risc-v虚拟机,纯c语言实现,无第三方库,支持ESP32 & GDB

大牛大神极别.

离线

楼主 #37 2021-06-10 16:08:36

xiaohui
会员
注册时间: 2019-01-15
已发帖子: 224
积分: 172

Re: [juicevm] 只需要不到5000行代码实现一个risc-v虚拟机,纯c语言实现,无第三方库,支持ESP32 & GDB

离线

#38 2021-06-22 11:14:58

qinxiongxu
会员
注册时间: 2018-12-13
已发帖子: 85
积分: 83

Re: [juicevm] 只需要不到5000行代码实现一个risc-v虚拟机,纯c语言实现,无第三方库,支持ESP32 & GDB

你们的github还能登录?貌似说已经被墙掉了。。

离线

#39 2021-06-22 11:19:13

哇酷小二
管理员
注册时间: 2020-04-22
已发帖子: 2,463
积分: 1902

Re: [juicevm] 只需要不到5000行代码实现一个risc-v虚拟机,纯c语言实现,无第三方库,支持ESP32 & GDB

我已经拿到楼主的源码, 才疏学浅还看不懂。

数了一下, 真不到5000行。

楼主正在忙赚钱的项目, 等后面有空会整理之后再开源。

离线

楼主 #40 2021-06-22 14:02:46

xiaohui
会员
注册时间: 2019-01-15
已发帖子: 224
积分: 172

Re: [juicevm] 只需要不到5000行代码实现一个risc-v虚拟机,纯c语言实现,无第三方库,支持ESP32 & GDB

qinxiongxu 说:

你们的github还能登录?貌似说已经被墙掉了。。

可以的呢

离线

#41 2021-06-22 16:09:42

哇酷小二
管理员
注册时间: 2020-04-22
已发帖子: 2,463
积分: 1902

Re: [juicevm] 只需要不到5000行代码实现一个risc-v虚拟机,纯c语言实现,无第三方库,支持ESP32 & GDB

xiaohui 说:
qinxiongxu 说:

你们的github还能登录?貌似说已经被墙掉了。。

可以的呢

有些地方, 有些网络确实打不开gayhub,。

不过呢,我打不开的时候自动切换到科学上网模式。

离线

楼主 #42 2021-07-16 14:34:36

xiaohui
会员
注册时间: 2019-01-15
已发帖子: 224
积分: 172

Re: [juicevm] 只需要不到5000行代码实现一个risc-v虚拟机,纯c语言实现,无第三方库,支持ESP32 & GDB

20210716更新:
请移步到https://whycan.com/t_6881.html

离线

楼主 #43 2021-07-16 16:03:53

xiaohui
会员
注册时间: 2019-01-15
已发帖子: 224
积分: 172

Re: [juicevm] 只需要不到5000行代码实现一个risc-v虚拟机,纯c语言实现,无第三方库,支持ESP32 & GDB

20210716更新:
esp32上运行juicevm。听说esp32和linux kernel更配哦
https://whycan.com/t_6899.html

离线

楼主 #44 2021-07-19 19:26:22

xiaohui
会员
注册时间: 2019-01-15
已发帖子: 224
积分: 172

Re: [juicevm] 只需要不到5000行代码实现一个risc-v虚拟机,纯c语言实现,无第三方库,支持ESP32 & GDB

ma6254 说:

可以gdb调试吗?

TODO

离线

楼主 #45 2021-07-19 19:28:58

xiaohui
会员
注册时间: 2019-01-15
已发帖子: 224
积分: 172

Re: [juicevm] 只需要不到5000行代码实现一个risc-v虚拟机,纯c语言实现,无第三方库,支持ESP32 & GDB

esp32运行linux的视频发布了:https://www.bilibili.com/video/av631861476

离线

楼主 #46 2021-07-25 22:28:07

xiaohui
会员
注册时间: 2019-01-15
已发帖子: 224
积分: 172

Re: [juicevm] 只需要不到5000行代码实现一个risc-v虚拟机,纯c语言实现,无第三方库,支持ESP32 & GDB

xiaohui 说:
ma6254 说:

可以gdb调试吗?

TODO

GDB调试已支持。
20210725更新:

juice_vm_release_for_Linux_b0583e8f.zip

juicevm_gdb2.pngjuicevm_gdb1.png

最近编辑记录 xiaohui (2021-07-25 22:35:58)

离线

楼主 #47 2021-07-26 12:17:10

xiaohui
会员
注册时间: 2019-01-15
已发帖子: 224
积分: 172

Re: [juicevm] 只需要不到5000行代码实现一个risc-v虚拟机,纯c语言实现,无第三方库,支持ESP32 & GDB

开源juicevm的gdb stub组件:https://github.com/juiceRv/gdb_stub_for_juicevm

最近编辑记录 xiaohui (2021-07-26 12:17:26)

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn