在RIOT操作系统中引入WASM虚拟机
编译问题
在默认状况下,RIOT操作系统的编译十分苛刻,会把很多WRANING变成ERROR,因此需要在Makefile中设置WERROR=0
,才可以进行正常编译
运行问题
由于WASM3的代码编写问题,WASM3虚机会在栈上分配大量空间,特别是在Parse的过程中,在之前是直接临时在栈上分配一个10k+的runtime进行parse。
而物联网操作系统包括RIOT通常没有内存保护(没有MMU支持),因此栈会溢出
而通常栈顶会放置该任务的控制块。虽然栈对象溢出并不会导致本任务的控制块被覆写,但是很可能会导致前一个任务的控制块被覆写。
因为通常idle任务和main任务的栈是系统在startup的时候预置的,一般都是相邻的,而且都是idle在前,main在后,如下图:
因此栈对象的溢出会覆写idle任务的控制块,导致任务调度到idle时发生异常(访问错误指针)
解决方案有两个方向
- (临时)增加任务栈大小,防止栈溢出
- 修改WASM3代码,避免在栈上分配较大的对象
我已经向WASM3提了Issue,但他们似乎不是很理解,只是将parse用的runtime栈复用了,而不是在栈上临时分配一个空间作为栈
但是重要的是他们的临时runtime对象仍然在栈上临时分配空间,接下来我会把我修改的WASM3代码(将parse用的临时runtime分配在堆上)提一个pull request上去。