写点什么

使用 wavm 运行 wasi wasm 程序

用户头像
Foliage
关注
发布于: 2020 年 06 月 18 日

wasi介绍



WASI是一个新的API体系, 由Wasmtime项目设计, 目的是为WASM设计一套引擎无关(engine-indepent), 面向非Web系统(non-Web system-oriented)的API标准. 目前, WASI核心API(WASI Core)在做覆盖文件, 网络等等模块的API, 但这些实现都是刚刚开始实现, 离实用还是有很长路要走.



目前支持wasi的运行时有以下几种:



  • wasmer

  • wasmtime

  • wavm



wavm介绍



WAVM是WebAssembly虚拟机,设计用于非Web应用程序。



特点



  • 快速



WAVM使用LLVM将WebAssembly代码编译为具有接近本机性能的机器代码。在某些情况下,它甚至可以胜过本机性能,这要归功于它能够生成针对运行代码的确切CPU进行了调整的机器代码。



WAVM还利用虚拟内存和信号处理程序来执行WebAssembly的边界检查的内存访问,其成本与本机的未经检查的内存访问相同。



  • 安全



WAVM阻止WebAssembly代码访问WebAssembly虚拟机*之外的状态,或调用未与WebAssembly模块明确链接的本机代码。



安装



对于centos可以使用官方预编译rpm包进行安装



yum install -y https://github.com/WAVM/WAVM/releases/download/nightly%2F2020-05-28/wavm-0.0.0-prerelease-linux.rpm



用法示例



clone官方库

git clone https://github.com/WAVM/WAVM
cd Examples



运行官方示例程序



wavm run helloworld.wast
wavm run zlib.wasm
wavm run trap.wast
wavm run echo.wast "Hello, world!"
wavm run helloworld.wast | wavm run tee.wast
wavm run --enable simd blake2b.wast



拆解wasm为wast



disassemble通过disassemble可以将wasm拆解为wast可读格式



wavm disassemble zlib.wasm zlib.wast



设置cache



WAVMOBJECTCACHE_DIR 环境变量为wavm设置运行时缓存



export WAVM_OBJECT_CACHE_DIR=/path/to/existing/directory
wavm run huge.wasm # Slow
wavm run huge.wasm # Fast



使用rust 实现wasi规范的wasm程序



查看rust支持的目标



通过执行



rustup target list



  • asmjs-unknown-emscripten 通过emscripten 工具链编译为asmjs,asmjs也是为了解决js性能问题

  • wasm32-unknown-unknown。此目标直接使用 llvm 后端编译成 wasm。 它适合纯 rust 代码编译,譬如你没有 C 依赖的时候。 跟 emscripten 目标比起来,它默认就生成更加洗练的代码, 而且也便于设置搭建。此处查看如何设置搭建.

  • wasm32-unknown-emscripten。此目标利用 emscripten 工具链编译成 wasm。 当你具有 C 依赖的时候就得使用它了,包括 libc

  • wasm32-wasi wasi规范的目标



创建rust lib项目



创建项目



cargo new --lib testwasi



项目配置



Cargo.toml中lib的配置如下



[lib]
name = "testwasi"
path = "src/lib.rs"
crate-type =["cdylib"]



代码实现



// # 直接把把名字作为符号写到目标文件中
#[no_mangle]
pub extern fn test(a: i32, b: i32) {
let z = a + b;
println!("The value of x is: {}", z);
}



编译



.cargo/config添加以下内容,制定编译结果为wasi格式



[build]
target = "wasm32-wasi"



执行cargo build



或执行cargo build --target=wasm32-wasi



使用wavm运行rust编译的wasm程序



# wavm run --function=test --abi=wasi target/wasm32-wasi/debug/testwasi.wasm 1 2
The value of x is: 3



总结



wasm虽然一开始是为了解决js的性能问题,但是由于其高性能,跨平台,众多运行时支持,已经不局限于web端,走向服务端,现在已经应用于servicemesh、serverless等方向,个人认为其可能成为下一代的container,相信其未来必定有更广泛的应用场景。



欢迎关注微信公众号:有点技术

发布于: 2020 年 06 月 18 日阅读数: 95
用户头像

Foliage

关注

公众号:有点技术 2018.08.07 加入

关注以下领域:golang、rust、k8s、serviceless、servicemesh、cloudnative

评论

发布
暂无评论
使用wavm运行wasi wasm程序