1 个不稳定版本

使用旧的 Rust 2015

0.1.0 2018年5月3日

#57#subsystem

MITLGPL-3.0

9KB
257

cervus

Join the chat at https://gitter.im/cervus-v/cervus

Linux 的 WebAssembly 子系统。

Screenshot

这是什么?

Cervus 在 Linux 内核之上实现了一个 WebAssembly "用户模式"(试图遵循 CommonWA 规范),使 wasm 应用程序可以直接在 ring 0 中运行,同时确保安全和安全性。

但是为什么?

  • 托管执行(使其能够根据跟踪/部分评估进行优化)
  • 避免系统调用和地址空间切换引入的性能开销
  • 零拷贝 I/O 是可能的

正在工作和未工作的事情

正在工作

  • 基于 HexagonE 的解释器
  • 基于 wasm-core 的二进制转换和加载
  • 大多数 CommonWA("一切皆 URL",文件 I/O,命令行参数)
  • IPC(目前只支持基于 URL 前缀的广播,前缀为 ipc-broadcast://

未工作

  • 浮点数
  • JIT
  • 其他所有东西

构建

内核模块

要求

  • xargo
  • 最新的夜间版 rust
  • 内核头文件
  • gnu make & gcc
./build_all.sh
sudo insmod glue/cervus.ko

加载器(cvctl)

此安装程序会安装 cvloadcvrun 二进制文件

cd cvctl
cargo install

应用程序

Cervus 实现了大多数 CommonWA(在 #2 跟踪),其示例可以在 cwa-rs/examples 中找到。

例如,构建并运行 cat 示例

sudo chmod 666 /dev/cvctl
cd cwa-rs
cargo build --target wasm32-unknown-unknown --release --example cat
cvrun target/wasm32-unknown-unknown/release/examples/cat.wasm file:///etc/lsb-release

启动 IPC 广播发送器,然后从中读取

cargo build --target wasm32-unknown-unknown --release --example broadcast_sender
cvrun target/wasm32-unknown-unknown/release/examples/broadcast_sender.wasm your_broadcast

(在另一个终端中)

cvrun target/wasm32-unknown-unknown/release/examples/cat.wasm ipc-broadcast://your_broadcast | dd of=/dev/null bs=4K

贡献

我忙于高考,直到 ~2018 年 6 月 10 日之前,在此期间无法积极维护此项目。然而,有一些事情可以相对容易地完成

  • 基于 Cretonne 的 JIT

由于 Cretonne 支持 no_std,与其他 JIT 方法相比,这应该相对容易。

通过实现 Backend 特性,与系统的其余部分进行接口,其中以位于 src/backend/hexagon_e 的基于解释器的后端作为起点是一个很好的例子。

  • 网络 API

可以将阻止网络API添加为虚拟系统调用。

许可证

Cervus自身必须使用GPL 2.0许可证,因为它链接到Linux内核。然而,在Cervus上运行的用户代码不受此限制。

依赖项

~2.2–3MB
~64K SLoC