2. 硬件隔离基础:物理隔离与逻辑隔离概念、GPU内部隔离域划分(安全区与非安全区)、隔离边界定义与保护机制

好,咱们进入第二章。这一章讲的是硬件隔离的根基——说白了,就是搞清楚「安全」和「不安全」之间那堵墙到底怎么砌。

我在做GPU安全架构那几年,最头疼的不是算法多复杂,而是「这堵墙该画在哪」。画错了,性能崩了;画漏了,安全没了。所以这一章,我建议你认真看。

2.1 物理隔离 vs 逻辑隔离:两种思路

先讲两个最基础的概念:物理隔离和逻辑隔离。很多人觉得这俩差不多,其实差远了。

2.1.1 物理隔离

物理隔离,就是字面意思——用硬件把两个区域彻底隔开。

  • 独立硬件单元:比如安全区有自己的SRAM、寄存器堆、总线接口
  • 专用数据路径:安全数据走专用通道,不和非安全区共享
  • 物理不可绕过:想访问安全区?必须走专门的安全门

我记得有一次,一个客户非要让安全区和非安全区共用一块SRAM。我说不行,他说「加个MPU不就行了?」。嗯,后来那个项目出了侧信道攻击,数据被隔壁的着色器读走了。从那以后,我对物理隔离特别执着。

核心原则:物理隔离是「你碰不到我」,逻辑隔离是「你碰得到但我不让你碰」。安全要求高的场景,优先选物理隔离。

2.1.2 逻辑隔离

逻辑隔离,则是通过权限检查、地址翻译、访问控制来实现的「软隔离」。

  • 共享硬件资源:同一个ALU、同一块缓存,但加了一把「锁」
  • 运行时检查:每次访问都要查权限表
  • 灵活但脆弱:一旦权限配置出错,隔离就失效了

你想想看,逻辑隔离就像小区门禁——有卡就能进,但卡丢了就完了。物理隔离呢?像监狱,墙是实心的,没门。

我的建议:在GPU里,关键安全资产(比如密钥、安全上下文)用物理隔离;普通数据(比如纹理、顶点缓冲)用逻辑隔离就够了。别一刀切。

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的访问权限
  • 总线防火墙:在总线层面过滤非法事务
  • 安全中断控制器:确保安全任务不会被非安全中断打断
  • 硬件看门狗:防止安全任务死锁后被非安全区接管
避坑指南:我曾经在一个项目里,只加了TZASC,没加总线防火墙。结果攻击者通过DMA绕过TZASC直接读安全内存。从那以后,我坚持「多层防护」——地址检查、总线过滤、事务审计,三层缺一不可。

2.4 小结

这一章咱们讲了:

  • 物理隔离和逻辑隔离的区别——一个靠墙,一个靠锁
  • GPU内部怎么划分安全区和非安全区——关键资产放安全区,普通任务放非安全区
  • 隔离边界怎么定义、怎么保护——地址、事务、时间、数据四个维度,加上多层保护机制

下一章,咱们会深入讲「GPU内部总线与互连安全」。到时候我会拿一个实际的总线拓扑出来,咱们一起看看数据流里哪些地方最容易出问题。

好,今天就到这儿。有什么问题,咱们课后聊。