我正在用WebAssembly text format (.wat)编写小程序。我看过从C编译的Wasm代码,看起来常见的做法是维护一个全局堆栈指针,当我们进入一个函数时,通过将堆栈指针减去4的某个倍数(例如16)来创建一个堆栈帧:
(global.set $g0
(local.tee $l1
(i32.sub
(global.get $g0)
(i32.const 16))))
;; --snip--
(global $g0 (mut i32) (i32.const 67088))我需要实现一个非常基本的malloc来进行动态内存管理。在这个实现中,我认为如果内存用完,我需要使用memory.grow来增加内存。
我的问题是:
当我增加内存时,我应该如何处理堆栈空间?AFAIK如果我什么都不做,内存是这样的:
+-----------------------+ high memory
| Newly acquired memory |
| |
+-----------------------+
| Stack space |
+-----------------------+
| Heap (managed with |
| malloc) |
+-----------------------+ low memory发布于 2020-10-09 03:02:15
默认情况下,wasm-ld (用于WebAssembly的llvm链接器)首先使用堆栈(在较低的地址)来布局内存。这允许sbrk (或者您的自定义malloc)使用memory.grow来扩展堆区域。堆的起始位置可以通过获取链接器创建的符号__heap_base的地址来找到。
https://stackoverflow.com/questions/64255700
复制相似问题