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 日 |
#1400 在 WebAssembly
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