kam*_*los 5 memory-management heap-memory webassembly
我正在使用clang -> llc -> s2wasm和 来从 C 编译为 WebAssembly clang -> lld。因为没有提供 c 库,所以我编写了自己的分配器。但我不确定找到空闲内存的开始的最佳方法是什么。
lld 和 s2wasm 似乎都有内存布局:| globals | stack | free memory |。使用 s2wasm 的堆栈指针位于内存地址,使用 lld 则位于全局地址(无法从 C 访问?)。
我发现的一种方法是使用以下 hack 在 wasm 执行开始时读取堆栈指针:
int stacktop()
{
int a;
return (int)(&a+1);
}
Run Code Online (Sandbox Code Playgroud)
这将创建一个局部变量,该变量不驻留在线性内存中并获取它的地址。为了生成地址,编译器将其放入内存堆栈中。
我使用返回值作为堆的开头。有没有更优雅且面向未来的方法来查找空闲内存?
小智 6
您需要获取__heap_baselld 创建的符号的地址:
$ cat wasm-heap.c
extern unsigned char __heap_base;
__attribute__ ((visibility("default")))
void * get_heap_base(void) {
return &__heap_base;
}
Run Code Online (Sandbox Code Playgroud)
__heap_base这将返回与导出到 JavaScript 的 WASM 变量相同的值:
$ cat wasm-heap.js
var imports = {memory: new WebAssembly.Memory({initial:2})};
const module = new WebAssembly.Module(read('wasm-heap.wasm', 'binary'));
const instance = new WebAssembly.Instance(module, { "env" : imports }).exports;
var u8_data = new Uint8Array(imports["memory"]["buffer"]);
print("Heap base in WASM: " + instance.get_heap_base());
print("Heap base exported to JS: " + instance.__heap_base);
$ js52 wasm-heap.js
Heap base in WASM: 66560
Heap base exported to JS: 66560
Run Code Online (Sandbox Code Playgroud)