openEuler RISC-V 上使用 MICA 对 MilkV-Duo 小核管理

openEuler RISC-V 上使用 MICA 对 MilkV-Duo 小核管理

演示视频效果

由于此处无法放置 gif 图片,于是给出相关链接

项目介绍

MICA

UniProton

SD 卡镜像烧录

1. 镜像烧录,开箱即用

我事先准备好了可以直接烧录的镜像,镜像里面跑的是 大核 openEuler RISC-V 2303 , 小核 UniProton , 可以直接使用 mica 对小核进行管理,也可以对小核镜像进行热更新

需要准备的硬件

  • MilkV-Duo 硬件 (64M)

  • 至少 16G 的 SD卡

  • 读卡器

需要准备的软件

烧录流程

  1. 根据提供的链接,下载镜像
  2. 使用 gunzip path2img/oe2303_uniproton.img.gz 解压镜像,得到 oe2303_uniproton.img
  3. 将 SD 卡插入读卡器一端,再将读卡器插入到电脑的 USB 卡槽 [此处电脑是 Ubuntu 或 其他发行版]
  4. 使用 lsblk 查看是否正确识别到 SD 卡 , 比如 /dev/sda
  5. 使用 sudo dd if=oe2303_uniproton.img of=/dev/sda bs=1M status=progress 烧录到 SD 卡中
  6. 烧录成功后,直接插入 MilkV-Duo 的 SD 卡槽,开机启动即可。
  7. 登陆系统
    1. 用户名 : root
    2. 密码 : openEuler12#$
    3. 注意 :RNDIS可能不可用,因此建议使用UART连接。

2. SDK编译,自DIY

MICA 的运行并不一定需要 openEuler , 只要能够解决 mica 的软件依赖 libsysfs, libmetal, libopenamp 即可在其他发行版上运行 MICA

此前已经有很多社区的伙伴在 MilkV-Duo 上运行过其他的发行版

Arch Linux

Debian Linux

可根据上述的链接,利用 duo-buildroot 编译出镜像,将其他发行版跑在 MilkV-Duo 上, 然后安装 软件依赖,编译 mcs 即可使用

[注 : 需要使用链接中提到的 sdk , 里面有针对 mica 的内核驱动模块 和 控制管理小核 UniProton 的 uni_pedestal 基座]

下面给出编译烧录openEuler 2303 + UniProton 的步骤 [ 下面的步骤参考了社区运行MilkV-Duo on openEuler 的案例,在此致谢!!]

  1. 下载 sdk [魔改后的版本]
git clone https://github.com/openeuler-riscv/duo-buildroot-sdk.git
cd duo-buildroot-sdk/
  1. 编译烧录出镜像

    docker run -itd --name duodocker -v $(pwd):/home/work milkvtech/milkv-duo:latest /bin/bash
    docker exec -it duodocker /bin/bash -c "cd /home/work && cat /etc/issue && ./build.sh milkv-duo"
    
  2. 拷贝镜像

    cd ..
    cp duo-buildroot-sdk/out/milkv-duo-yyyyMMdd-hhmm.img .
    
  3. 烧录镜像

    sudo dd if=milkv-duo-yyyyMMdd-hhmm.img of=/dev/your-device bs=1M status=progress
    
  4. 准备替换根文件系统。由于原始镜像的根文件系统空间不足,需要重新分区。由于我们不会使用原始的根文件系统,因此简单地删除原始分区即可。

    sudo fdisk /dev/your-device
    
    # In fdisk
    d
    3
    d
    2
    n
    p
    2
    
    w
    
    # In bash
    sudo mkfs.ext4 /dev/your-device-p2
    
  5. 这里下载已经带有 MICA 和 UniProton 的 openEuler 2303 的根文件系统

  6. 将 SD 卡的第二个分区挂到一个目录上并解压根文件系统到该目录

    mkdir mnt
    sudo mount /dev/your-device-p2 mnt
    sudo tar -zxvf /path/to/oe2303_uniproton_rootfs.tar.gz -C mnt
    
  7. 取消挂载,拔出 SD 卡 ,安装到 MilkV-Duo上

    sudo umount mnt
    
  8. 登陆系统

    1. 用户名 : root
    2. 密码 : openEuler12#$
    3. 注意 :RNDIS可能不可用,因此建议使用UART连接。

再给出在其他发行版上使用 MICA 的大体步骤:

  1. 根据 社区支持 基于改动过的 sdk 成功运行 其他发行版 [其中 sdk 主要是提供 mica 需要的驱动模块,修改了相关的设备树 ]
  2. 根据对应发行版的包管理工具自行下载 libsysfs, libmetal, libopenamp 或者自己根据源码编译
  3. 根据 MICA README 文档编译 MICA 项目, 能够在 Duo 上适配的 MICA 项目在这里
  4. 体验 MICA

使用 MICA 管理小核

小核生命周期管理,小核热插拔、热更新

  1. 首先抑制内核日志的打印等级,防止内核信息打印到屏幕上 , 导致信息错乱

    echo "1 4 1 7" > /proc/sys/kernel/printk
    
  2. 检查 Client OS 的状态 , 这里可以观察到 Client OS 的状态和名字

    mica status
    
  3. 启动 Client OS , 可以看到 uniproton 输出的一些日志信息 [如果不想要,自己可以后续热更新小核镜像的时候去掉就好了]

    mica start uniproton
    
  4. 关闭 Client OS

    mica stop uniproton
    

小核tty service

  1. 在执行 mica status 的时候,可以看到 Client OS 绑定的服务 , 比如 可能会绑定 tty service 到 /dev/ttyRPMSG1 设备上

  2. 可以执行 screen 打开 Client OS 的 shell

    screen /dev/ttyRPMSG0
    
  3. 体验 Client OS [UniProton] 的shell

小核 rpc service

  1. 暂未支持 【 TODO 会在完成支持后对这部分文档进行完善 】

添加自己的 service

  1. 详情请见项目 UniProton 和 项目 MICA 【 TODO 会在上游仓库的 PR 合入后对这部分的文档进行完善 】

在线热更新小核镜像

  • 小核镜像在 /lib/firmware/milkvduo_uniproton.elf
  • 小核开发详情请见 UniProton 【 TODO 在上游支持的 PR 合入后对这部分的文档进行完善 】