• 在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上去。

  • 相关阅读:
    css3
    如何去渲染数据?
    ajax
    Java多线程-线程安全
    java多线程-基础
    Git-团队开放中的代码同步与提交
    IDEA 调试Spring-boot 应用
    微服务-各种pom的配置和注解
    微服务-服务与注册中心
    微服务
  • 原文地址:https://www.cnblogs.com/bforever/p/14247251.html
Copyright © 2020-2023  润新知