如何在 Wasm 中实现“malloc”

Posted

技术标签:

【中文标题】如何在 Wasm 中实现“malloc”【英文标题】:How to implement "malloc" in Wasm 【发布时间】:2019-07-15 02:14:07 【问题描述】:

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

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

所以,我很好奇如何在 wasm 世界中实现 malloc。我已经知道 malloc 在glibc 中是如何工作的:使用 brk() 或 sbrk() 来扩展堆和一些用于衬里地址的内存管理。但在 wasm 世界中,我认为不可能调用 brk()sbrk() 来获取班轮地址。

这样使用全局var来实现malloc合理吗?

u_char mem[10240];


void *wasm_malloc(size_t num)

    /*get the free mem idx*/
    return &mem[idx];

【问题讨论】:

【参考方案1】:

等等,你不需要这样做。

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

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

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

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

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

emmalloc 对你来说可能更有趣。它是由 Emscripten 团队设计的用于 web 环境的简单而紧凑的 malloc 实现。可以看源码here。

【讨论】:

来源改为github.com/emscripten-core/emscripten/blob/main/system/lib/…

以上是关于如何在 Wasm 中实现“malloc”的主要内容,如果未能解决你的问题,请参考以下文章

如何在C中实现单链表

EasyPlayer.js如何在iOS上实现低延时直播?FLV(wasm) or WebRTC

6-7 在一个数组中实现两个堆栈 (20 分)

在 WebAssembly 中实现回调的方式

如何在android中实现svm模型?

如何在 laravel 中实现 vuetify?