gpt4 book ai didi

emscripten - 如何在 Wasm 中实现 "malloc"

转载 作者:行者123 更新时间:2023-12-03 23:11:06 28 4
gpt4 key购买 nike

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

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

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

最佳答案

等等,你不需要这样做。

I don't think that importing malloc and free from real world is practicable.


不正确。这正是使用 Emscripten 的重点。 Emscripten 不仅仅是一个 C/C++ 到 Wasm 的编译器,而是一个完整的工具链,其中包括一个 Web 运行时和它自己的 libc,专门设计用于以最少的源代码修改为 Web 浏览器运行 C/C++ 程序。
Emscripten libc 是 musl 的一个经过大量修改的分支.它实现/模拟了广泛的标准 C 库(包括 mallocsbrk )和 POSIX API(如 pthread 和 BSD 套接字),除了一些在 Wasm 环境中没有意义的 API,如 execfork .通过使用 emcc命令,您将开箱即用地链接这些 libc 端口。所以请随意使用 malloc - 你什么都不用做!
如果您仍然想知道如何实现 malloc对于 Emscripten,Emscripten 有 two options of malloc implementations - dlmalloc 和 emmalloc。
dlmalloc是一个著名的 malloc 实现。 glibc 也使用它的 fork 版本。可以看到 Emscripten 的 dlmalloc 版本 here .
emmalloc 可能对您更有趣。它是由 Emscripten 团队设计的用于 Web 环境的简单紧凑的 malloc 实现。可以查看源码 here .

关于emscripten - 如何在 Wasm 中实现 "malloc",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57032577/

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