在RIOT操作系统中引入WASM虚拟机

编译问题

在默认状况下,RIOT操作系统的编译十分苛刻,会把很多WRANING变成ERROR,因此需要在Makefile中设置WERROR=0,才可以进行正常编译

运行问题

由于WASM3的代码编写问题,WASM3虚机会在栈上分配大量空间,特别是在Parse的过程中,在之前是直接临时在栈上分配一个10k+的runtime进行parse。
而物联网操作系统包括RIOT通常没有内存保护(没有MMU支持),因此栈会溢出
而通常栈顶会放置该任务的控制块。虽然栈对象溢出并不会导致本任务的控制块被覆写,但是很可能会导致前一个任务的控制块被覆写。
因为通常idle任务和main任务的栈是系统在startup的时候预置的,一般都是相邻的,而且都是idle在前,main在后,如下图:
image.png
因此栈对象的溢出会覆写idle任务的控制块,导致任务调度到idle时发生异常(访问错误指针)
解决方案有两个方向

  1. (临时)增加任务栈大小,防止栈溢出
  2. 修改WASM3代码,避免在栈上分配较大的对象

我已经向WASM3提了Issue,但他们似乎不是很理解,只是将parse用的runtime栈复用了,而不是在栈上临时分配一个空间作为栈
但是重要的是他们的临时runtime对象仍然在栈上临时分配空间,接下来我会把我修改的WASM3代码(将parse用的临时runtime分配在堆上)提一个pull request上去。

posted @ 2021-01-07 16:46  bforever  阅读(374)  评论(0编辑  收藏  举报