# Computer Architecture Background
现代计算机是在主板上的。它连接了 RAM, 处理器,IO 设备,网卡 (NIC). 这些设备和 CPU 的交流是通过不同的 bus 系统实现的。大多数 bus 是在 Platform Controller Hub (PCH), 也叫 IO Controller Hub. 这个 chip 是之前南桥的演化,北桥是在 CPU 芯片内部的。PCH 包含了很多控制器接口,比如 USB, SATA, 和 PCI (Peripheral Component Interconnect). 对于可以 DMA 的 bus 系统,他们的控制器部分是 DMAC. PCH 与 CPU 的连接是一个点对点的 serial link, 叫 DMI (Direct Media Interface). DMI 是被用于高速 bus 让 CPU 和 IO 设备快速交换信息。
# memory space
内存空间是一个地址空间,它可以是主存,或者 IO 位置 (memory-mapped I/O). 这些 IO 位置可以是配置寄存器或者设备内部内存。
CPU 先给 IO Controller 发送内存请求,请求通过 PCIe 或者 DMI 到对应的控制器。设备也可以通过 DMA 访问映射的地址空间。
# PCI
PCI (Peripheral Component Interconnect) 是一个 bus 主要的系统,bus 是以一个广播网络的方式连接其他设备的。在同一时刻只有一个设备可以发送,所以需要一个主设备 (bus master),只有主设备可以通信,如果其它设备要成为主设备必须请求,允许之后才可以。
每一个可以连接 PCI 的设备都有一个配置空间,它可以被系统配置软件访问。这个地址空间分为预定义的 header 区域和设备独立的区域。header 可以被 OS 访问来识别设备和配置设备的行为。
# PCIe
PCIe (PCI Express) 是一个基于包裹的,高速序列点对点连接 (PCIe slot 设备和 PCIe root complex),
一共有三层: physical, data link, 和 transaction. Data Link 层是用来修正错误的,流控制。transaction 层是把用户数据变成 transaction layer packets. 每个 layer 都有自己的 header. 后来,Root Complex (RC) 从 PCH 移到了 CPU 内部。这使得设备和 CPU 缓存更加近了。于是发展了 DCA (Direct Cache Access), DDIO.
# Root Complex
根节点,连接 CPU,内存,和 IO 设备,允许拆分数据包
# GPU Architecture
# GPU Execution Model
GPU 是完全由 CPU 控制的从属处理器。任何 CPU 进程都可以通过特权模式的 GPU 驱动程序,调用 GPU 内核,启动 GPU 程序。
CPU 对 GPU 的访问仅通过 API 比如 NVIDIA CUDA 和 OpenCL .
# GPU Memory Hierarchy
NVIDIA GPU 包含一些 streaming multiprocessors (SMs) 流处理器, 可以运行上千个线程。每个线程可以访问它的私有寄存器,局部内存 on-die scratchpad memory, 和在所有 SM 共享的全局内存。全局内存有 2 层缓存,L1 data cache 是对每个 SM 私有的,L2 是所有 SM 共有的。
# 指令缓存
NVIDIA GPU 有很多级指令缓存,是指令专有的缓存,不在全局内存里面。当一个新的 GPU 程序运行的时候,GPU driver 会 flush 这些指令缓存。NVIDIA 也没有提供 API 来 flush 缓存,所以,在运行时写入 GPU 内核程序不会改变当前运行的程序。
# GPU 访问 CPU 内存
有个 API (cudaHostRegister) 可以把一个 CPU 的内存映射到 GPU 内核地址空间上。当映射形成的时候,GPU 可以直接访问 CPU 的内存,不需要 CPU 参与 (DMA). 类似的,GPU 也可以通过设置 MMIO,访问其他连接到 PCIe 上的设备,比如 (GPUDirectRDMA API 可以让 GPU 之间互相访问)
GPU 内部的 page table 可以被 GPU driver 访问,但对 CPU OS 不可见。
和 CPU 不同,GPU 访问 CPU 的内存不会经过 MMU,所以 CPU 不会实时检查。当 mapping 产生的时候,GPU 就拿到了访问权限。
# IOMMU
当一个设备通过 DMA 访问 CPU 物理内存的时候,他用设备的地址空间。IOMMU 会把设备的地址空间 map 到 CPU 的物理地址空间。IOTLB Cache 会缓存整个 IO page table. 在 IO page table 包含了保护信息,IOMMU 会检查每个内存访问是否有足够的权限。IOTLB 和 IO page table 不一定是一致的。软件必须显式管理 IOTLB coherence 来,当它被 IO Page Table 移除的时候,需要 flush 缓存。
# Microprocessors and MMIO registers in GPUs
GPU 暴露一些寄存器用于 MMIO, 它被 GPU Driver 使用。此外,还有微处理器来管理内部硬件资源。GPU Driver 在每次 GPU 初始化的时候会更新 GPU 微处理器的代码。对此的文档很少。
我们发现 GPU MMIO 可以让 GPU 指令缓存作废。通过 flush 指令缓存可以更新 GPU 程序。有个微代码攻击利用了 NVIDIA Microprocessor 可以允许 GPU 不限制的访问 CPU 内存。
# Confidential GPU
# Attack
# PixelVault Attack
PixelVault 提出了基于 GPU 的关于 RSA,AES 加密的 security co-processor. PixelVault 把 secret key 存在 GPU 内存里,把 master key 存在 GPU 寄存器里。