第七章:进程与通信模型
Trusty OS采用了一种轻量级的任务模型,与传统的Linux进程模型有显著区别,专为安全关键环境设计。
Trusty通过以下机制实现任务间的内存隔离:
每个任务拥有独立的虚拟地址空间,通过MMU实现硬件级隔离
任务内存需求在编译时确定,运行时无法动态扩展
严格的内存访问权限控制,防止越界访问
注意:Trusty任务模型不支持动态内存分配(malloc/free),所有内存需求必须在编译时确定。
| 特性 | Trusty任务 | Linux进程 |
|---|---|---|
| 创建方式 | 静态创建,系统启动时初始化 | 动态创建(fork/exec) |
| 内存管理 | 静态分配,固定大小 | 动态分配,支持分页和交换 |
| 调度策略 | 固定优先级调度 | 多种调度策略(CFS,实时等) |
| 上下文切换开销 | 极小(仅寄存器保存) | 较大(包含TLB刷新等) |
TIPC(Trusted IPC)是Trusty系统中任务间及安全世界与非安全世界间通信的核心机制。
tipc_create_port()创建通信端口
// 服务端示例代码
int port = tipc_create_port("com.example.trusty.service",
TIPC_PORT_ALLOW_TA_CONNECT);
if (port < 0) {
// 错误处理
}
// 客户端示例代码
int chan = tipc_connect("com.example.trusty.service",
TIPC_PORT_AUTO);
if (chan < 0) {
// 错误处理
}
TIPC支持两种消息传递模式:
// 同步消息发送示例
struct my_msg msg = { ... };
int rc = tipc_send(chan, &msg, sizeof(msg), 0, 1000 /* timeout_ms */);
if (rc != sizeof(msg)) {
// 错误处理
}
// 异步消息接收示例
struct tipc_event evt;
while (tipc_wait(port, &evt, 1000) == NO_ERROR) {
if (evt.event == TIPC_EVENT_MSG) {
// 处理消息
struct my_msg *msg = (struct my_msg *)evt.msg;
// ...
tipc_put_msg(evt.msg); // 释放消息缓冲区
}
}
安全警告:TIPC消息传递虽然经过内核验证,但应用层仍需验证消息内容的完整性和真实性,防止恶意构造的消息导致安全问题。
TIPC支持安全世界(Trusty)与非安全世界(Normal World)之间的通信:
NS_PORT标志创建可被非安全世界访问的端口Trusty提供了安全的共享内存机制,用于高效的数据交换,同时保证安全隔离。
| 类型 | 描述 | 使用场景 |
|---|---|---|
| 静态共享内存 | 编译时预定义的固定大小内存区域 | 已知固定大小的数据交换 |
| 动态共享内存 | 运行时按需分配的内存区域 | 可变大小的数据交换 |
| 世界间共享内存 | 安全与非安全世界共享的内存区域 | 跨世界大数据传输 |
跨世界共享内存需要特殊的映射机制: