如何在 Wasm 中实现“malloc”

Nai*_*Jay 4 emscripten webassembly

我现在正在学习WebAssembly,发现外部函数(libc 或第三方函数)无法被 Wasm 世界轻松访问(使用 import 是通用解决方案)。

我试图用emcc编译我的源代码到WASM但mallocfree广泛应用于我的源代码。我认为从现实世界中导入malloc和导入free是不可行的。

所以,我很好奇如何malloc在 wasm 世界中实现。我已经知道 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];
}
Run Code Online (Sandbox Code Playgroud)

Bum*_*Kim 6

等等,你不需要这样做。

我认为从现实世界中导入 malloc 和 free 是不可行的。

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

Emscripten libc 是经过大量修改的musl 分支。它实现/模拟了广泛的标准 C 库(包括malloc, sbrk)和 POSIX API(如 pthread 和 BSD 套接字),除了一些在 Wasm 环境中没有意义的 API,如execfork。通过使用emcc命令,您将开箱即用地链接这些 libc 端口。所以随意使用malloc- 你不需要做任何事情!

如果您仍然想知道如何malloc为 Emscripten实现,Emscripten 有两个malloc实现选项- dlmalloc 和 emmalloc。

dlmalloc是一个著名的 malloc 实现。glibc 也使用它的分叉版本。您可以在此处查看 Emscripten 的 dlmalloc 版本。

emmalloc 可能对您更有趣。它是由 Emscripten 团队设计的用于 Web 环境的简单紧凑的 malloc 实现。您可以在此处查看源代码。

  • 源更改为 https://github.com/emscripten-core/emscripten/blob/main/system/lib/emmalloc.c (2认同)