首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WebAssembly (& WASI)中的堆栈空间

WebAssembly (& WASI)中的堆栈空间
EN

Stack Overflow用户
提问于 2020-10-08 12:16:59
回答 1查看 125关注 0票数 1

我正在用WebAssembly text format (.wat)编写小程序。我看过从C编译的Wasm代码,看起来常见的做法是维护一个全局堆栈指针,当我们进入一个函数时,通过将堆栈指针减去4的某个倍数(例如16)来创建一个堆栈帧:

代码语言:javascript
复制
    (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如果我什么都不做,内存是这样的:

代码语言:javascript
复制
+-----------------------+  high memory
| Newly acquired memory |
|                       |
+-----------------------+
| Stack space           |
+-----------------------+
| Heap (managed with    |
|       malloc)         |
+-----------------------+  low memory
EN

回答 1

Stack Overflow用户

发布于 2020-10-09 03:02:15

默认情况下,wasm-ld (用于WebAssembly的llvm链接器)首先使用堆栈(在较低的地址)来布局内存。这允许sbrk (或者您的自定义malloc)使用memory.grow来扩展堆区域。堆的起始位置可以通过获取链接器创建的符号__heap_base的地址来找到。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64255700

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档