4 个版本

使用旧的 Rust 2015

0.0.4 2020 年 3 月 10 日
0.0.3 2020 年 3 月 10 日
0.0.2 2020 年 3 月 10 日
0.0.1 2020 年 3 月 9 日

#1400WebAssembly

MIT/Apache

3KB

目前这只是一个粗略的想法

瓦迪

Web Assembly Device Interface (wadi) 是为希望提供设备驱动程序的 wasi 宿主提供的补充规范。用户可能会希望在启动或运行时扩展/减少宿主环境的特性。本规范帮助标准化 wasi 与基于 Web Assembly 的设备文件通信的方式。

工作原理

宿主环境必须首先有方法将设备驱动程序 WebAssembly 模块集成到运行中的宿主环境中。考虑一个假设的设备驱动程序 cowbell.wasm,它播放铃声,以及一个假设的 wasmer 环境。我们首先需要加载这个驱动程序。

libw::write_text("/_wasmer/kernel/driver","/home/richard/cowbell.wasm");

设备驱动程序 WebAssembly 暴露出一些外部函数,这些函数将被宿主环境调用。最初,它将在设备模块上调用 init()

设备模块的职责是首先注册将要处理的文件范围。牛铃可能只想要在您的 wasi 宿主环境中一个文件('/dev/cowbell'),但其他设备可能想要处理整个目录层次结构(/dev/usb/*)。

一旦注册,该设备就可以像其他任何 wasi 文件一样使用。

libw::write_text("/dev/cowbell","play");

wadi 对暴露给 WebAssembly 模块的额外宿主函数没有限制,允许设备做它在宿主内想做的任何事情。

示例

use wadi::{register_scope,CString,cstr}
use js_ffi::*;

#[no_mangle]
pub fn init() {
    register_scope("/dev/cowbell");
}

#[no_mangle]
pub fn write(path: CString, data_ptr: usize, data_len: usize) {
    js!(window.alert).invoke_1("clonk!");
}

#[no_mangle]
pub fn name() -> usize {
    cstr("cowbell")
}

瓦迪设备接口

  • init() - 启动设备并注册范围
  • read(path,location, size, target) - 从文件路径读取一定数量的字节
  • write(path,data,location,size) - 从文件写入一定数量的字节
  • query(path) - 获取设备控制的一个或多个文件的信息
  • malloc(size) - 请求一些内存以便写入数据
  • free(ptr) - 释放数据
  • name() - 返回模块的名称

瓦迪宿主接口

  • register_device(file_scope, file_type)
  • error(err)

依赖项

~220–365KB