2. 硬件隔离基础:物理隔离与逻辑隔离概念、GPU内部隔离域划分(安全区与非安全区)、隔离边界定义与保护机制
好,咱们进入第二章。这一章讲的是硬件隔离的根基——说白了,就是搞清楚「安全」和「不安全」之间那堵墙到底怎么砌。
我在做GPU安全架构那几年,最头疼的不是算法多复杂,而是「这堵墙该画在哪」。画错了,性能崩了;画漏了,安全没了。所以这一章,我建议你认真看。
2.1 物理隔离 vs 逻辑隔离:两种思路
先讲两个最基础的概念:物理隔离和逻辑隔离。很多人觉得这俩差不多,其实差远了。
2.1.1 物理隔离
物理隔离,就是字面意思——用硬件把两个区域彻底隔开。
- 独立硬件单元:比如安全区有自己的SRAM、寄存器堆、总线接口
- 专用数据路径:安全数据走专用通道,不和非安全区共享
- 物理不可绕过:想访问安全区?必须走专门的安全门
我记得有一次,一个客户非要让安全区和非安全区共用一块SRAM。我说不行,他说「加个MPU不就行了?」。嗯,后来那个项目出了侧信道攻击,数据被隔壁的着色器读走了。从那以后,我对物理隔离特别执着。
2.1.2 逻辑隔离
逻辑隔离,则是通过权限检查、地址翻译、访问控制来实现的「软隔离」。
- 共享硬件资源:同一个ALU、同一块缓存,但加了一把「锁」
- 运行时检查:每次访问都要查权限表
- 灵活但脆弱:一旦权限配置出错,隔离就失效了
你想想看,逻辑隔离就像小区门禁——有卡就能进,但卡丢了就完了。物理隔离呢?像监狱,墙是实心的,没门。
2.2 GPU内部隔离域划分:安全区与非安全区
好,概念讲完了。咱们看看GPU里具体怎么分。
一个典型的GPU,内部会划分成两个大域:安全区(Secure World)和非安全区(Normal World)。这俩不是随便画的,而是基于「信任等级」来划分的。
2.2.1 安全区包含什么?
- 安全引擎:负责加解密、密钥管理、安全启动
- 安全上下文寄存器:存着当前安全任务的权限、密钥索引
- 安全内存区域:比如受TZASC(TrustZone Address Space Controller)保护的内存
- 专用DMA通道:安全数据搬运不走普通DMA
2.2.2 非安全区包含什么?
- 着色器核心:执行普通图形和计算任务
- 纹理单元:处理纹理采样
- 光栅化单元:做像素处理
- 普通内存:用户态驱动能访问的内存
我曾经在一个项目里,把安全引擎和着色器核心放在同一个时钟域里。结果安全引擎的密钥被着色器的电磁辐射干扰,读出了错误值。后来我们加了一个独立的时钟域和电源域,问题才解决。嗯,这就是物理隔离的代价——面积和功耗都会涨。
2.3 隔离边界定义与保护机制
隔离域画好了,接下来就是「边界」怎么定义、怎么保护。
2.3.1 边界定义
隔离边界,就是安全区和非安全区之间的「分界线」。这条线不是一条线,而是一组规则:
- 地址边界:哪些地址属于安全区,哪些属于非安全区
- 事务边界:哪些总线事务可以跨域,哪些不行
- 时间边界:什么时候可以切换安全/非安全模式
- 数据边界:哪些数据可以跨域传递,哪些必须加密
说白了,边界就是「允许什么、禁止什么」的清单。我在项目中习惯用一张表来定义:
| 边界类型 | 允许操作 | 禁止操作 | 保护机制 |
|---|---|---|---|
| 地址边界 | 安全区读安全内存 | 非安全区读安全内存 | TZASC + MPU |
| 事务边界 | 安全DMA写安全内存 | 非安全DMA写安全内存 | AXI保护标签 |
| 时间边界 | 安全上下文切换 | 非安全中断打断安全任务 | 安全中断控制器 |
| 数据边界 | 加密数据跨域 | 明文密钥跨域 | 硬件加密引擎 |
2.3.2 保护机制
边界定义好了,还得有「保安」守着。常见的保护机制有:
- 地址空间控制器(TZASC):检查每个内存访问是否越界
- 内存保护单元(MPU):检查CPU/GPU的访问权限
- 总线防火墙:在总线层面过滤非法事务
- 安全中断控制器:确保安全任务不会被非安全中断打断
- 硬件看门狗:防止安全任务死锁后被非安全区接管
2.4 小结
这一章咱们讲了:
- 物理隔离和逻辑隔离的区别——一个靠墙,一个靠锁
- GPU内部怎么划分安全区和非安全区——关键资产放安全区,普通任务放非安全区
- 隔离边界怎么定义、怎么保护——地址、事务、时间、数据四个维度,加上多层保护机制
下一章,咱们会深入讲「GPU内部总线与互连安全」。到时候我会拿一个实际的总线拓扑出来,咱们一起看看数据流里哪些地方最容易出问题。
好,今天就到这儿。有什么问题,咱们课后聊。