关于wasm micro runtime堆的大小的指定

关于wasm micro runtime堆的大小的指定

在实际应用中,我们需要定制一个wasm解释器,并在wasm解释器启动后,运行事先编译后的wasm字节码程序中的某个函数。wasm程序可以是一个单独的.wasm文件,也可以将.wasm文件的内容作为一个数组定义,嵌入在wasm解释器的程序中。无论哪种情况,如果.wasm客户程序的函数需要动态分配内存的话,在初始化wasm解释器时,需要指定堆的大小。在指定堆的大小时,如果参数指定不当,wasm的函数在非配内存时,可能失败。通过下面的例子,我们给出一个示范,希望对使用wasm micro runtime的用户有所帮助。

首先,需要定义一个静态或者全局的数组,用于wasm解释器的初始化和用为wasm客户程序提供一个堆。
这样wasm客户程序就可以使用malloc函数,Intel给出的示范程序中,这个数组的大小是512k.
下面的相关代码,其中
init_args.mem_alloc_option.pool.heap_size = sizeof(global_heap_buf);
定义了堆的大小

static char global_heap_buf[512*1024];

RuntimeInitArgs init_args;
memset(&init_args, 0, sizeof(RuntimeInitArgs));

init_args.mem_alloc_type = Alloc_With_Pool;
init_args.mem_alloc_option.pool.heap_buf = global_heap_buf;
init_args.mem_alloc_option.pool.heap_size = sizeof(global_heap_buf);

if (  !wasm_runtime_full_init(&init_args)) 
{
    printf("Init runtime environment failed.\n");
    return ;
}

接下来,在调用wasm_runtime_instantiate时,第三个参数heap_size也指定了堆的大小。

module_inst = wasm_runtime_instantiate(module,stack_size,heap_size,error_buf,sizeof(error_buf));

看到这里,大家可能有个疑问,这里这个heap_size和上面的init_args.mem_alloc_option.pool.heap_size有什么关系呢?
我这里给出一个回答,不一定准确,来源主要通过实验。
首先,wasm_runtime_instantiate函数的heap_size必须小于在调用wasm_runtime_full_init或者wasm_runtime_memory_init函数时指定的堆大小。init_args.mem_alloc_option.pool.heap_size中批定的堆有两部分用用途,一部分用于wasm运行时初始化,另一个用途是为wasm客户程序提供一个堆,以便使用malloc函数。那么wasm_runtime_instantiate中的 heap_size如何设置呢?假如wasm客户程序中需要调用一个malloc函数,分配n字节,那么这里这个heap_size 必须大于n+8,否则,当调用malloc函数时失败。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值