主要观点: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 的
setjmp
和longjmp
机制。 - 在 CHERIoT 中实现线程局部解栈处理程序时,利用操作系统最早实现线程局部存储的方式,即在栈顶预留空间,通过
cgettop
和csetaddress
指令获取和设置地址,存储错误处理程序头。 - PR301 增加的新错误处理程序类型在隔间未提供正常错误处理程序、栈空间不足或栈无效时运行,即使栈指针无效也能通过 CPU 陷阱和切换器找到并运行。
- 用户可通过添加
add_deps("unwind_error_handler")
到xmake.lua
的compartment
声明下添加错误处理程序,C 程序员使用宏实现,C++使用on_error
函数,且使用setjmp
时需注意声明volatile
。此机制简单轻量,可用于保护代码免受故障影响。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。