功能
一款轻量的运行时,可以在用户态、嵌入式、内核等多种环境运行。支持多种方式运行:字节码解释执行、jit成本机指令执行、编译为SPF/BARE文件运行。
特点
轻量:runtime极度轻量,能以极低的代价到处移植
兼容:兼容多种运行环境,包括嵌入式、内核、用户态、跨OS、跨硬件平台
灵活:APP开发难度低,部署灵活快速,可以快上快下,可以动态加载、卸载APP
高性能:可以编译为本地指令执行
节省空间:BARE和SPF格式文件非常小,占用空间小
架构
spf系统主要分为两部分: 编译工具 + runtime。
编译工具支持将源文件编译为SPF/BARE文件
runtime负责运行SPF/BARE文件
文件格式
当前支持两种目标指令集:ARM64和X86-64 支持输出两种不同的文件格式:SPF格式和BARE格式。
BARE格式较简单,支持bss全局变量(不支持data, rodata), 支持内部子函数、支持helper。不支持map。
SPF格式比BARE格式复杂(但也比elf要简单),支持全局变量(bss、data、rodata)、子函数、map、helper。
编译
cd spf
这里有两个build_xxx.sh文件,分别是不同环境下的编译脚本
在MACOS机器上
./build_macos.sh
在Linux机器上
./build_linux.sh
编译结果在: build/out/spf/
使用示例
cd spf
# ./build_mac.sh 或者 ./build_linux.sh
# 本例以linux上执行为例
./build_linux.sh
cd build/out/spf
cp -r ../../../loader/* ./
cp ../../../example/*.o ./
# 执行示例
./spfcmd hello_world.o
./spfcmd app/lua5.1.spf -e "print('hello world')"
# 先转换为spf文件再执行
./spfbuilder convert hello_world.o -o hello_world.spf -j
./spfcmd hello_world.spf
# 转换为bare文件执行
./barebuilder convert hello_world.o -o hello_world.bare
./bare-cmd hello_world.bare
编写APP 示例
到 example 目录 创建 hello_world.c, 输入以下内容:
#include "utl/ulc_user.h"
SEC("tcmd/hello_test")
int main()
{
BPF_Print("Hello world!! \n");
return 0;
}
编译成ebpf字节码文件:
clang -O2 -I ../h -target bpf -c hello_world.c -D IN_ULC_USER
APP说明
lua5.1.spf: 将lua5.1编译成了spf格式文件. 不支持浮点数运算
loader_cmd.spf: 交互式spf运行时
nc_server.spf: nc服务器
runtime说明
bare-cmd: 运行BARE文件
bare-interactive: 以交互模式运行BARE文件
spfcmd: 运行SPF文件的runtime
mini: 非常小的bare runtime示例
uboot: 在uboot中嵌入运行时
ovs: 在ovs中嵌入运行时