问题标签 [wasi]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
149 浏览

system - WebAssembly (&WASI) 中的堆栈空间

我正在用 WebAssembly 文本格式 ( .wat) 编写小程序。我查看了从 C 编译的 Wasm 代码,看起来常见的做法是维护一个全局堆栈指针,当我们进入一个函数时,通过将堆栈指针减去 4 的倍数(例如 16 ):

我需要实现一个非常基础malloc的动态内存管理。在这个实现中,我认为如果内存不足,我需要增加memory.grow内存。

我的问题:

当我增加内存时,我应该如何处理堆栈空间?AFAIK,如果我什么都不做,内存看起来像这样:

0 投票
1 回答
1040 浏览

clang - Emscripten 和 Clang 在 WebAssembly 编译方面有什么区别

我知道 clang(通过使用 target=wasm32)和 emscripten 都可以将 C 代码编译成 webassembly,但是它们有什么不同呢?

看起来他们都使用 LLVM 作为后端。其实,我什至不太了解llvm和clang之间的关系......

我已经阅读 WebAssembly 有一段时间了,但我对它缺乏底层的理解。非常感谢您的参与!!

0 投票
1 回答
683 浏览

webassembly - 为什么 WebAssembly 是安全的,什么是线性内存模型

(1) 我听说 WebAssembly 的安全性是通过提供线性内存来实现的。我想知道这个线性内存包含什么?wasm 堆栈和堆是否位于此内存空间中?如果是,我认为 wasm 堆栈和胶水代码堆栈(例如,js python 等)是分开的,对吗?

(2) 我可以通过使用导入表来了解 wasm 的内存安全性。换句话说,wasm 函数不能调用线性内存之外的任何函数,因为它只能使用索引来调用导入的函数。除此之外,wasm 还提供哪些其他安全性?也许是来自上面的堆栈问题。

(3) 看起来 wasm 中也有控制流完整性。也就是说每个函数的返回地址都是固定的,不能在这个函数内部修改。这是一个正确的理解吗?

非常感谢!

0 投票
1 回答
22 浏览

c++ - 在 WebAssembly 应用程序中存储版本

我有用 C++/Qt 5.15.x 编写的 REST 服务。在某些 URL 下,REST 服务会发送 WASM 内容。这是一个用 C++/Qt 5.15.x 编写的 GUI 应用程序(REST 客户端)。可以嵌入一些显示版本等的功能吗?我想以“bla-bla.wasm --version”样式在服务器端(Debian)加载wasm。或者通过原生 REST 服务从 wasm 调用一些函数。

事实上,REST 服务在服务器端检测到 wasm 更新,并通过 WebSocket 通知客户端新版本。

0 投票
1 回答
245 浏览

rust - 如何使用 wasmer-wasi 从 Rust 中的 WASM 读取现有目录?

我写了一个简单的 wasmer-wasi 示例来读取目录条目,但它总是失败。

wasi_fs_example/src/lib.rs

runner/src/main.rs

这会在运行时产生错误:

该示例的完整源代码位于此处。为什么它不起作用?

0 投票
1 回答
385 浏览

filesystems - WASI vs Emscripten FS,沙盒文件系统

据我所知,WASI 为沙盒 WebAssembly 应用程序提供了访问底层操作系统的权限,Emscripten FS 还提供了几个文件系统,例如 NODEFS。我的问题是 WASI 和 EMscriptenFS 都代表提供沙盒文件系统的相同目标,或者这两者有不同的用法?有人可以帮助我理解两者吗?

0 投票
1 回答
748 浏览

rust - 如何在 WASI 中使用 Rust 的 async/await 语法

我想用cargo-wasi编译以下代码。

尝试编译后出现以下错误,因为mio目前不支持WASI

我做了一些研究,到目前为止我发现的例子都没有使用 async/await。有什么我可以替换tokio的东西,所以我的代码可以在 WASI 中编译吗?

0 投票
1 回答
379 浏览

node.js - 从 rust wasm32-wasi 调用 console.log 而不需要 ssvm/ssvmup

我想使用到 console.log 的消息进行调试。

我们有一个 rust wasm32-wasi 函数从运行在 nodejs 中的 javascript 调用。由于其他限制,我们不能使用 ssvm/ssvmup。

我们可以做些什么来在控制台中查看来自 wasm 代码的消息吗?

0 投票
1 回答
1580 浏览

c - 为什么这个 wasm 模块中有“wasi_snapshot_preview_1”导入?

最近我尝试用尽可能少的助手来尝试 webassembly。

所以我创建了 ac 项目,包含了一些库 ( stb_image.h) 并尝试编译它。

这是一个简短的可重现示例:

这是我使用的命令:

emcc converter.c -s STANDALONE_WASM -o converter.wasm --no-entry

这很好用,并给了我一个有效的 wasm 文件。

但后来我尝试在浏览器中用 javascript 实例化它,没有别的:

但我得到这个错误:

Uncaught (in promise) TypeError: WebAssembly.instantiate(): Import #0 module="wasi_snapshot_preview1" 错误:模块不是对象或函数

我检查了 webassembly,确实我的 webassembly 需要这些功能:

我知道这些是纯 wasm 模块中不支持的功能(可能像 os 调用?),但我找不到任何关于它们到底是什么的文档。

所以我的问题是:

  • 为什么是这些功能?
  • stb_image如果标头应该只是在没有 i/o 的情况下操作 ram 中的位,为什么我需要这些导入的函数?
  • 如何告诉我的编译器不要使用这些函数(阻止 stdio 库可以工作,但我不知道该怎么做)
  • 我必须在“import”变量中放入什么来加载带有模拟函数的模块?

任何迹象都值得赞赏!

编辑

在尝试编译 c 标准库之后,我了解了这些函数的用途:

  • fd_write用于打印(通常到操作系统中的标准输出)
  • fd_seek并且fd_close用于文件操作

还有fd_read读取文件,但我不需要在这段代码中

  • proc_exit终止进程并可能引发错误

但我真的不明白为什么在我的情况下需要它们:程序不打印任何东西,代码中也没有“退出”:(

0 投票
0 回答
152 浏览

java - WASI 和 JVM - 操作系统抽象

我的问题是 JVM 是否真的也提供了一个虚拟操作系统,类似于 WASI 的做法。

据我了解,WASM 和 JVM 都是虚拟机,提供了执行某些字节码的环境。他们的目标是抽象机器层,从而抽象出 CPU(架构)及其 ISA。

由于其沙盒设计,WASM 本身无法访问其他系统资源(fs、网络等)。这就是 WASI 作为 WASM 的扩展,提供了一个抽象的操作系统层,以便可以访问系统资源。

对于 Java 应用程序,我可以直接在 JVM 上使用本机 (Java) API,例如 java.io/java.nio 或 java.net。

我知道这两种方法处理安全性的方式不同。例如,我不需要自己向 Java 应用程序提供对文件的访问,但与 WASI 一样,我确实需要。我的问题是,如果它们在操作系统的情况下在概念上提供类似的抽象级别。

WASI 的来源:https ://hacks.mozilla.org/2019/03/standardizing-wasi-a-webassembly-system-interface/