问题标签 [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.
system - WebAssembly (&WASI) 中的堆栈空间
我正在用 WebAssembly 文本格式 ( .wat
) 编写小程序。我查看了从 C 编译的 Wasm 代码,看起来常见的做法是维护一个全局堆栈指针,当我们进入一个函数时,通过将堆栈指针减去 4 的倍数(例如 16 ):
我需要实现一个非常基础malloc
的动态内存管理。在这个实现中,我认为如果内存不足,我需要增加memory.grow
内存。
我的问题:
当我增加内存时,我应该如何处理堆栈空间?AFAIK,如果我什么都不做,内存看起来像这样:
clang - Emscripten 和 Clang 在 WebAssembly 编译方面有什么区别
我知道 clang(通过使用 target=wasm32)和 emscripten 都可以将 C 代码编译成 webassembly,但是它们有什么不同呢?
看起来他们都使用 LLVM 作为后端。其实,我什至不太了解llvm和clang之间的关系......
我已经阅读 WebAssembly 有一段时间了,但我对它缺乏底层的理解。非常感谢您的参与!!
webassembly - 为什么 WebAssembly 是安全的,什么是线性内存模型
(1) 我听说 WebAssembly 的安全性是通过提供线性内存来实现的。我想知道这个线性内存包含什么?wasm 堆栈和堆是否位于此内存空间中?如果是,我认为 wasm 堆栈和胶水代码堆栈(例如,js python 等)是分开的,对吗?
(2) 我可以通过使用导入表来了解 wasm 的内存安全性。换句话说,wasm 函数不能调用线性内存之外的任何函数,因为它只能使用索引来调用导入的函数。除此之外,wasm 还提供哪些其他安全性?也许是来自上面的堆栈问题。
(3) 看起来 wasm 中也有控制流完整性。也就是说每个函数的返回地址都是固定的,不能在这个函数内部修改。这是一个正确的理解吗?
非常感谢!
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 通知客户端新版本。
rust - 如何使用 wasmer-wasi 从 Rust 中的 WASM 读取现有目录?
filesystems - WASI vs Emscripten FS,沙盒文件系统
据我所知,WASI 为沙盒 WebAssembly 应用程序提供了访问底层操作系统的权限,Emscripten FS 还提供了几个文件系统,例如 NODEFS。我的问题是 WASI 和 EMscriptenFS 都代表提供沙盒文件系统的相同目标,或者这两者有不同的用法?有人可以帮助我理解两者吗?
rust - 如何在 WASI 中使用 Rust 的 async/await 语法
我想用cargo-wasi编译以下代码。
尝试编译后出现以下错误,因为mio目前不支持WASI
我做了一些研究,到目前为止我发现的例子都没有使用 async/await。有什么我可以替换tokio
的东西,所以我的代码可以在 WASI 中编译吗?
node.js - 从 rust wasm32-wasi 调用 console.log 而不需要 ssvm/ssvmup
我想使用到 console.log 的消息进行调试。
我们有一个 rust wasm32-wasi 函数从运行在 nodejs 中的 javascript 调用。由于其他限制,我们不能使用 ssvm/ssvmup。
我们可以做些什么来在控制台中查看来自 wasm 代码的消息吗?
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
终止进程并可能引发错误
但我真的不明白为什么在我的情况下需要它们:程序不打印任何东西,代码中也没有“退出”:(
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/