CHERIoT RTOS 中改进的错误处理

主要观点:CHERI 平台特别是 CHERIoT 能将很多静默数据损坏的 bug 转为可恢复错误,在 CHerBSD 和 CHERI 扩展到 POSIX 及 CHERIoT RTOS 中,CHERI 故障以信号传递,可通过定义错误处理程序进行低级错误恢复操作,但自定义错误处理程序难写且遇栈耗尽无法运行,近期 PR 构建了更友好的错误处理机制。
关键信息

  • CHERI 平台可转 bug 为可恢复错误,CHERIoT RTOS 有类似机制,故障发生时会调用注册点的寄存器文件副本。
  • 传统自定义错误处理程序难写,栈耗尽时无法运行。
  • CHERIoT 采用旧机制实现异常,基于 RV32E 只需 32 字节存储状态。
  • 实现线程局部解栈处理程序时利用 CHERI 的局部/全局机制,通过在栈顶预留空间存储错误处理程序头。
  • PR301 增加了不使用栈的新错误处理程序类型,即使栈溢出也能运行错误处理程序。
    重要细节
  • 在 CHerBSD 和 CHERI 扩展到 POSIX 中,CHERI 故障以信号传递,在 CHERIoT RTOS 中每个隔间可定义错误处理程序。
  • 传统异常实现方式如 64 位 Windows 和 *NIX 系统的表驱动解栈器及语言特定异常构建在其之上,CHERIoT 借鉴 16 位和 32 位 Windows 及 OpenStep 的setjmplongjmp机制。
  • 在 CHERIoT 中实现线程局部解栈处理程序时,利用操作系统最早实现线程局部存储的方式,即在栈顶预留空间,通过cgettopcsetaddress指令获取和设置地址,存储错误处理程序头。
  • PR301 增加的新错误处理程序类型在隔间未提供正常错误处理程序、栈空间不足或栈无效时运行,即使栈指针无效也能通过 CPU 陷阱和切换器找到并运行。
  • 用户可通过添加add_deps("unwind_error_handler")xmake.luacompartment声明下添加错误处理程序,C 程序员使用宏实现,C++使用on_error函数,且使用setjmp时需注意声明volatile。此机制简单轻量,可用于保护代码免受故障影响。
阅读 11
0 条评论