gpt4 book ai didi

memory-management - 使用 lld 和 s2wasm 查找堆的开始

转载 作者:行者123 更新时间:2023-12-04 07:41:59 25 4
gpt4 key购买 nike

我正在使用 clang -> llc -> s2wasm 从 C 编译到 WebAssembly还有clang -> lld .因为没有提供 c 库,所以我编写了自己的分配器。但我不确定最好的方法是找到空闲内存的开始。

lld 和 s2wasm 似乎都有内存布局:| globals | stack | free memory | .使用 s2wasm 的堆栈指针位于内存地址,使用 lld 它位于全局(不能从 C 访问?)。

我发现的一种方法是在 wasm 执行开始时使用此 hack 读取堆栈指针:

int stacktop()
{
int a;
return (int)(&a+1);
}

这将创建一个局部变量,该变量不驻留在线性内存中并获取它的地址。为了生成地址,编译器将其放入内存堆栈中。

我使用返回的值作为我的堆的开始。有没有更优雅和面向 future 的方法来找到空闲内存?

最佳答案

您需要获取__heap_base的地址lld 创建的符号:

$ cat wasm-heap.c
extern unsigned char __heap_base;

__attribute__ ((visibility("default")))
void * get_heap_base(void) {
return &__heap_base;
}

这将返回与 __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

关于memory-management - 使用 lld 和 s2wasm 查找堆的开始,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49980381/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com