Webassembly增长内存并导入malloc

时间:2017-04-21 13:19:59

标签: webassembly

在阅读规范后,我试图增加一些记忆并做了以下事情:

(module
  (table 0 anyfunc)
  (memory $0 1)
  (export "memory" (memory $0))
  (export "f" (func $0))
  (func $0 (param $0 i32) (result i32)
    get_local $0
    grow_memory
  )
)

现在我希望如果我们输入10,我们的页面大小为11的倍数,那么类似于:

 (memory $0 1)

成为

 (memory $0 11)

我必须添加一个返回值,因为堆栈没有被清空。现在我假设如果成功的话,该方法会返回除-1之外的其他内容吗?在这种情况下,我认为它有效,我应该有更多的页面。

我知道还有JS方式,但我更喜欢直接在WebAssembly中完成所有这些工作。有趣的是,我们可以从" Env"中导入C函数,如malloc,free,strcopy等。

所以我的问题是:我的方法是增长记忆力吗?我应该导入C风格模块吗? grow_memory和realloc()之间的关系是什么,或说区别?

1 个答案:

答案 0 :(得分:2)

grow_memory会返回之前的尺寸(以页为单位)或-1 according to its specification

这不会更改初始页面分配(memory $0 1)!这是模块的静态属性,而当前内存大小是内存的动态属性。这就像增长一个你最初保留1个元素的数组。您最初仍保留1,更改的是当前大小。

您还可以使用drop来忽略grow_memory的返回值。

malloc / free / realloc是您可以使用grow_memory实现的所有内容。该操作码与sbrk类似。当然,WebAssembly嵌入器也使用内存分配来授予操作码的请求,这可能本身可以用malloc / free / realloc实现,或者更可能用mmap实现。