wee_alloc(一种malloc替代品)如何知道在WebAssembly中从何处开始堆?

时间:2018-08-26 03:39:25

标签: compiler-construction malloc webassembly

我正在尝试以自定义语言使用wee_alloc,并在WebAssembly中运行。但是,我需要充分了解它如何知道从哪里开始堆,以便我的堆栈和静态分配不会破坏堆,反之亦然。

据我了解,malloc等如何。知道从哪里开始堆是依赖于平台的,通常只是一个约定,或者在某些情况下不适用。但是在WebAssembly中,我们只能有一个连续的线性内存块,因此我们必须共享它,并且需要使用约定。

Reading through the code it appears,wee_alloc所做的假设是,无论我们以什么开头的内存都是完全不可用的,而是使用grow_memory指令来创建堆所需的第一块内存。这实际上意味着堆开始的索引/地址是初始大小的最高索引,再加上一个。 (编辑:实际上不是+ 1,我忘记了索引是从零开始的;错误一是☠️)

例如如果我们以1页的初始内存大小开始:

 current_memory = 1 page = 64KiB = 65,536 bytes

然后堆从索引65537开始。

我的理解正确吗?

1 个答案:

答案 0 :(得分:1)

  

您的理解是正确的!但是有一个小例外:   索引从零开始,第一页的最后一个索引是65535,   并且第二页的第一个索引是65536。-@pepyakin

https://github.com/rustwasm/wee_alloc/issues/61#issuecomment-416868326