同步操作将从 王天宇/mcs 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
目前工控设备、航天设备、机器人系统、智能车系统对功能和生态的需求日益丰富,对实时性、可靠性、安全性提出了更高的要求,由单一OS承载所有功能面临的挑战越来越大。针对这些场景,我们提出了混合关键性系统(MCS, Mixed Criticality System),实现在一颗片上系统中部署多个OS,同时提供Linux的服务管理能力以及实时OS带来的高实时、高可靠的关键能力。
mcs_km: 提供OpenAMP所需内核模块,支持Client OS启动、专用中断收发、管理保留内存等功能。
rpmsg_pty_demo: 提供OpenAMP用户态程序Linux端样例,支持在Linux上通过pty设备访问Client OS。
library: 提供OpenAMP样例必需的模块remoteproc、virtio、rpmsg、openamp。
zephyr: 提供样例镜像文件,在每个demo中,zephyr_qemu.bin运行在qemu上,zephyr_rpi.bin运行在树莓派上,该文件需要被加载至设定的0x7a000000起始地址。启动后会运行OpenAMP Client端的样例程序,并与Linux端进行交互。
OpenAMP旨在通过非对称多处理器的开源解决方案来标准化异构嵌入式系统中操作环境之间的交互。
OpenAMP是一个软件框架,提供了为AMP系统开发软件应用程序所需的软件组件,允许操作系统在复杂的同构和异构体系结构中交互。
OpenAMP包括如下三大重要组件:
样例Demo通过提供mcs_km.ko 内核模块实现Linux内核启动从核的功能,并预留了OpenAMP通信所需的专用中断及其收发机制。用户可在用户态通过dev设备实现Client OS的启动,并通过rpmsg组件实现与Client OS的简单通信。
mcs支持两种构建安装方式:
集成构建
目前在 openEuler Embedded 版本中已经实现了mcs的集成构建,支持一键式构建出包含mcs的qemu、树莓派镜像。集成构建方法请参考 openEuler Embedded 在线文档章节:混合关键性系统构建指南。
单独构建
根据openEuler Embedded使用手册安装SDK并设置SDK环境变量。
交叉编译内核模块 mcs_km.ko,编译方式如下:
cd mcs_km
make
交叉编译用户态样例 rpmsg_main,编译方式如下:
cmake -S . -B build -DDEMO_TARGET=rpmsg_pty_demo
cd build
make
# 若sdk的安装路径为/opt/openeuler/sdk
cd /opt/openeuler/sdk/sysroot
find . -name libmetal.so*
find . -name libopen_amp.so*
find . -name libsysfs.so*
# 将以上so安装到运行环境中的 /usr/lib64 目录中
目前mcs支持在qemu-aarch64和树莓派上部署运行,部署mcs需要预留出必要的内存、CPU资源,并且还需要bios提供psci支持。
若使用树莓派的集成构建镜像,无需进行单独配置,具体的使用方法请参考 openEuler Embedded 在线文档章节:混合关键性系统使用方法。 其他镜像则需要进行下述额外的配置操作:
通过配置dts预留出mcs_mem
QEMU
QEMU需要制作一份dtb,通过 -dtb file
使用,制作步骤如下:
# 安装 qemu-system-aarch64、dtc
$ apt install qemu-system-arm device-tree-compiler # ubuntu
# 获取 QEMU devicetree
$ qemu-system-aarch64 -M virt,gic-version=3 -m 1G -cpu cortex-a57 -nographic -smp 4 -M dumpdtb=qemu.dtb
$ dtc -I dtb -O dts -o qemu.dts qemu.dtb
# 修改qemu.dts,添加 reserved-memory 节点,预留出 0x70000000 - 0x80000000 的内存
reserved-memory {
#address-cells = <0x02>;
#size-cells = <0x02>;
ranges;
mcs@70000000 {
reg = <0x00 0x70000000 0x00 0x10000000>;
compatible = "mcs_mem";
no-map;
};
};
# 制作最终使用的dtb文件
$ dtc -I dts -O dtb -o qemu_mcs.dtb qemu.dts
Raspberry Pi
树莓派支持使用 dt-overlay 的方式,制作步骤如下:
# 新增 mcs-memreserve-overlay.dts
/dts-v1/;
/plugin/;
/ {
fragment@0 {
target-path = "/";
__overlay__ {
reserved-memory {
#address-cells = <2>;
#size-cells = <1>;
ranges;
mcs@70000000 {
reg = <0x00 0x70000000 0x10000000>;
compatible = "mcs_mem";
no-map;
};
};
};
};
};
# 制作使用的dtbo
$ dtc -I dts -O dtb -o mcs-memreserve.dtbo mcs-memreserve-overlay.dts
# 挂载树莓派boot分区,将 mcs-memreserve.dtbo 安装到树莓派boot分区的overlays中:
$ cp mcs-memreserve.dtbo ${rpi_boot_path}/overlays/
# 修改树莓派的config.txt,新增 dtoverlay 使能 mcs-memreserve.dtbo
$ echo "dtoverlay=mcs-memreserve" >> ${rpi_boot_path}/config.txt
隔离cpu用于启动实时OS
通过修改内核cmdline,增加maxcpus=3
隔离3核。
QEMU
在启动qemu时,增加 -append 'maxcpus=3'
即可。
Raspberry Pi
树莓派使用支持 psci 的 uefi 引导固件,因此通过 grub.cfg 配置cmdline,修改 ${rpi_boot_path}/EFI/BOOT/grub.cfg
,添加 maxcpus=3
即可。
使用支持psci的bios启动镜像
QEMU
qemu无需单独配置bios,启动命令如下:
$ qemu-system-aarch64 -M virt,gic-version=3 -m 1G -cpu cortex-a57 -nographic -append 'maxcpus=3' -smp 4 -kernel zImage -initrd *.rootfs.cpio.gz -dtb qemu_mcs.dtb
Raspberry Pi
树莓派需要使用支持 psci 的 uefi 引导固件,具体参考 openEuler Embedded 在线文档章节:树莓派的UEFI支持和网络启动
按照上述3个步骤,准备好运行环境后,接下来就可以进行 mcs 的安装和使用:
根据前文的构建安装指导,安装:
调整内核打印等级并插入内核模块
为了不影响shell的使用,先屏蔽内核打印:
$ echo "1 4 1 7" > /proc/sys/kernel/printk
插入内核模块:
$ insmod mcs_km.ko
插入内核模块后,可以通过 cat /proc/iomem
查看预留出来的 mcs_mem,如:
qemu-aarch64 ~ # cat /proc/iomem
...
70000000-7fffffff : reserved
70000000-7fffffff : mcs_mem
...
若mcs_km.ko插入失败,可以通过dmesg看到对应的失败日志,可能的原因有:
运行rpmsg_main程序,使用方式如下:
$ ./rpmsg_main -c [cpu_id] -t [target_binfile] -a [target_binaddress]
eg:
# qemu
$ ./rpmsg_main -c 3 -t zephyr_qemu.bin -a 0x7a000000
# Raspberry Pi
$ ./rpmsg_main -c 3 -t zephyr_rpi.bin -a 0x7a000000
若rpmsg_main成功运行,会有如下打印:
qemu-aarch64 ~ # ./rpmsg_main -c 3 -t zephyr.bin -a 0x7a000000
...
start client os
...
pls open /dev/pts/1 to talk with client OS
pty_thread for uart is runnning
...
此时按ctrl-c
可以通知client os下线并退出rpmsg_main,下线后支持重复拉起。
也可以根据打印提示,通过/dev/pts/1
与client os进行shell交互,例如:
# 新建一个terminal,登录到运行环境
$ ssh user@ip
# 连接pts设备
$ screen /dev/pts/1
# 敲回车后,可以打开client os的shell,对client os下发命令,例如
uart:~$ help
uart:~$ kernel version
注意,这里的/dev/pts/1
并非是一个固定的路径,路径的最后的那个数字是一个可以变化的值。如果我们启动了两个实例,那么有可能之后的那个实例的pts路径为/dev/pts/2
。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。