使用emscripten编译为WebAssembly时可以找到“空闲”内存的起始地址吗?

问题描述 投票:0回答:1

所以,我有一个 C 应用程序,例如,需要一个字符串:

void EMSCRIPTEN_KEEPALIVE modify_entity(char* target) { ... }

为了与之交互,我需要将目标放入 WebAssembly 内存中的某个位置。本质上,我的 Embedder 将以 C 代码所需的格式创建字符串(在本例中为以 null 结尾的 ASCII 字符串)并将其放入 WebAssembly 内存中,然后将指向该内存地址的指针传递到函数中。

但是:我怎么知道把它放在内存中的哪个位置?

如果我查看 .wat 文件,我会发现 emscripten 添加了几个数据部分:

  ...
  (data $d10 (i32.const 1619) "\14")
  (data $d11 (i32.const 1631) "\17\00\00\00\00\17\00\00\00\00\09\14\00\00\00\00\00\14\00\00\14")
  (data $d12 (i32.const 1677) "\16")
  ...

我的理解是,这些数据段存在于同一内存中(单个

(export "memory" (memory $memory))
),因为目前 WebAssembly 实现仅支持单个内存。因此,如果我要写入地址 1619 处的内存,我会覆盖数据部分的内容,这会很糟糕。

这是正确的吗?如果这是正确的,嵌入器是否有某种方法可以找到可用内存的有效内存地址?我可以手动检查.wat文件并找到第一个空闲内存,但我想知道是否有变量或函数?

唯一看起来有希望的是全局:

(global $g0 (mut i32) (i32.const 67456))
。但该全局似乎在整个生成的 WebAssembly 代码中使用,因此我不确定是否应该将其用作空闲内存指针。

或者我是否必须以某种方式从 WebAssembly 公开 malloc/free 函数?我知道有很多我可以使用的实现,但我希望嵌入器能够自行处理所有这些,因为我需要的只是找到一些可以安全使用的空闲内存。这可能吗,还是很愚蠢,因为我会与 C 端发生的任何内部内存分配竞争?

webassembly emscripten
1个回答
0
投票

你应该只为 malloc/free 创建直通函数。

另外,建议传递一个字符串指针和一个长度,但它是容器化的。如果你想传递一个以 null 结尾的字符串,那没问题。

还要确保你的js字符串实际上是一个char*

或者如果你想要 hacky 解决方案: 增加 wasm 内存并将您的字符串放入新页面中(前提是您可以保证您的函数不会调用 malloc)

你的问题本质上“找个地方放我的字符串”只是要求内存分配。

这里是多个记忆的建议是的,目前只有一个记忆。

© www.soinside.com 2019 - 2024. All rights reserved.