重要性及作用:密封是 CHERI 最重要的部分之一,能实现可用的分区接口,构建类型安全的不透明类型,在互信和委托情况下安全使用。最近编译器和 RTOS 的更新使编程更友好。
- 不透明类型即句柄:代码常输出可回传的不透明值,如 C 语言中库暴露的
PrivateType
,调用者只传递指针作为不透明句柄,这是软件工程边界而非安全边界,系统调用边界也有类似抽象,如 Windows 的HANDLE
和 POSIX 系统的文件描述符,但在分解单块内核时管理访问权限变复杂,CHERIoT 旨在通过硬件抽象减少软件复杂性。 - 使用密封实现不透明类型:在 CHERI 系统中,密封 CHERI 能力(指针)后变成不透明令牌,密封能力包含对象类型字段,存储用于密封的能力值,以确定可解封它的能力。可存储密封能力、复制,但不能使用,只能用正确的能力解封,C 语言中密封类似
char *sealed = cheri_seal(ptr, someKey)
,密封指针受时间安全机制约束,CHERIoT RTOS 用SObj*
作为所有密封类型的占位符,存在一些不便。 - 类型系统中的密封指针:CHERIoT LLVM 的[PR 109]引入
__sealed_capability
类型限定符,尝试解引用或修改密封能力地址在编译时出错,密封内置函数返回和要求__sealed_capability
限定的指针,使暴露不透明类型更易,编译器允许密封指针隐式转换为void*
,转回需显式转换。 - 向后兼容性:现有代码用
SObj*
,采用新方式需在 RTOS 中更改[PR 427],添加CHERI_SEALED(T)
宏,若依赖SObj*
可定义CHERIOT_NO_SEALED_POINTERS
恢复旧行为,此变化也反映在CHERI::Capability
包装模板中。 - C++助手:将密封暴露到类型系统中可在 C++中使用,添加
CHERI::remove_sealed
/CHERI::remove_sealed_t
模板去除密封限定符,CHERI::is_sealed_capability
/CHERI::is_sealed_capability_v
谓词模板可查询能力是否密封,与 C++概念组合可定义要求密封或解封指针的重载。
- 不透明类型即句柄:代码常输出可回传的不透明值,如 C 语言中库暴露的
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。