如何在Wasm中实现“ malloc”

时间:2019-07-15 02:14:07

标签: emscripten webassembly

我现在正在学习WebAssembly,发现Wasm world无法轻松访问外部功能(libc或第三方功能)(使用导入是一种通用解决方案)。

我正在尝试使用emcc将源代码编译为wasm,但是mallocfree在我的源代码中得到了广泛使用。我认为从现实世界中导入mallocfree是不可行的。

因此,我很好奇如何在wasm世界中实现malloc。我已经知道malloc在glibc中是如何工作的:使用brk()或sbrk()扩展堆和班轮地址的某些内存管理。但是在wasm世界中,我认为无法致电brk()sbrk()来获取班轮地址。

使用全局变量来实现malloc是否合理?

u_char mem[10240];


void *wasm_malloc(size_t num)
{
    /*get the free mem idx*/
    return &mem[idx];
}

1 个答案:

答案 0 :(得分:0)

等等,您不需要这样做。

  

我认为导入malloc并从现实世界中解放出来是不可行的。

不正确。这正是使用Emscripten的重点。 Emscripten不仅是一个从C / C ++到Wasm的编译器,而且是一个完整的工具链,其中包括一个Web运行时和它自己的libc,专门为运行Web浏览器的C / C ++程序而设计,而对源代码的修改最少。

Emscripten libc是musl的经过大量修改的分支。它实现/模拟了多种标准C库(包括mallocsbrk)和POSIX API(例如pthread和BSD套接字),但某些在Wasm环境中没有意义的API除外,例如{ {1}}和exec。通过使用fork命令,您可以直接连接那些libc端口。因此,只需使用emcc就可以了-您无需执行任何操作!

如果您仍然想知道如何为Emscripten实现malloc,则Emscripten具有two options of malloc implementations-dlmalloc和emmalloc。

dlmalloc是著名的malloc实现。 glibc也使用它的分叉版本。您可以看到Emscripten的dlmalloc here版本。

emmalloc对您可能更有趣。这是Emscripten团队设计的用于Web环境的简单紧凑的malloc实现。您可以看到源代码here