6.数据结构-StreamContext
2026-06-12
本文链接为:http://www.usbzh.com/article/detail-1711.html ,欢迎转载,转载请附上本文链接。
一、定义与作用
Streams(数据流)是USB 3.0规范引入的一项重要特性,它允许单个Bulk端点同时处理多个独立的传输请求。这项技术主要被UASP等高级存储协议使用,显著提升了USB存储设备的性
传统USB传输中,每个Bulk端点就像一个单车道——一次只能处理一个传输请求,必须等前一个完成才能处理下一个。而Streams技术支持后,同一个Bulk端点可以拥有多个独立的传输队列(称为Stream Rings),驱动可以同时提交多个传输请求,设备可以决定先处理哪个
- 主机控制器限制:xHCI硬件声明其支持的Stream ID数量上限
- 设备端点限制:每个SuperSpeed Bulk端点也声明自己能处理的Stream数量
- 实际分配数:最终分配数量取两者最小值,驱动必须能处理分配数少于请求数的情况
Stream数量是由USB设备在“SuperSpeed Endpoint Companion Descriptor”(超高速端点伴随描述符)的 bmAttributes 字段中声明的.
bmAttributes:
- 如果这是个批量端点:4:0 MaxStreams。 这个端点支持的流的最大数量。有效值是从 0 到 16,其中值为 0 表示端点没有定义流。对于值 1 至 16,所支持的流等于2^MaxStream。7:5 保留。这些位是保留,并应设置为零。
- 如果这是个控制或中断端点:7:0 保留。这些位是保留,并应设置为零。
- 如果这是个等时端点:1:0 Mult。基于零的值,决定服务时间间隔内,这端点支持的包的最大数量。包的最大数量 = bMaxBurst x (Mult + 1) 。这个字段可设置的最大值是2. 7:2 保留。这些位是保留,并应设置为零.
| 属性 | 说明 |
|---|---|
| 大小 | 固定 16 字节(独立于控制器的上下文大小设置) |
| 用途 | 定义 USB3 端点的数据流传输环(Stream Transfer Ring) |
| 组织方式 | 多个 StreamContext 组成 Stream Context Array |
二、结构定义(代码层面)
typedef struct _STREAM_CONTEXT {
union {
ULONG64 DequeuePointer; // 64位传输环出队指针
struct {
ULONG64 DequeueCycleState:1; // 循环状态位
ULONG64 StreamContextType:3; // 上下文类型
ULONG64 DequeuePointerLo:28; // 指针低位
ULONG64 DequeuePointerHi:32; // 指针高位
};
};
union {
ULONG Reserved1;
struct {
ULONG StreamEDTLA:24; // 流端点描述符列表地址
ULONG Reserved2:8;
};
// ... 其他变体结构
};
union {
ULONG Reserved4;
struct {
ULONG PartialTRBLength:17; // 部分TRB长度
ULONG Reserved5:15;
};
// ... 其他变体结构
};
} STREAM_CONTEXT;
C_ASSERT(sizeof(STREAM_CONTEXT) == 16); // 始终16字节
三、核心字段详解
3.1 DequeuePointer(出队指针)
| 字段 | 位宽 | 说明 |
|---|---|---|
DequeueCycleState |
1位 | 循环状态位(Cycle Bit),用于判断TRB有效性 |
StreamContextType |
3位 | 流上下文类型(见下表) |
DequeuePointerLo/Hi |
60位 | 指向流传输环的物理地址 |
3.2 Stream Context Type(类型枚举)
| 值 | 宏定义 | 含义 |
|---|---|---|
| 0 | STREAM_CONTEXT_TYPE_SECONDARY_TR |
二级传输环 |
| 1 | STREAM_CONTEXT_TYPE_PRIMARY_TR |
主传输环 |
| 2 | STREAM_CONTEXT_TYPE_PRIMARY_SSA_8 |
主SSA(8个流上下文) |
| 3 | STREAM_CONTEXT_TYPE_PRIMARY_SSA_16 |
主SSA(16个流上下文) |
| 4 | STREAM_CONTEXT_TYPE_PRIMARY_SSA_32 |
主SSA(32个流上下文) |
| 5 | STREAM_CONTEXT_TYPE_PRIMARY_SSA_64 |
主SSA(64个流上下文) |
| 6 | STREAM_CONTEXT_TYPE_PRIMARY_SSA_128 |
主SSA(128个流上下文) |
| 7 | STREAM_CONTEXT_TYPE_PRIMARY_SSA_256 |
主SSA(256个流上下文) |
端点描述符列表地址)" class="reference-link">3.3 StreamEDTLA(流端点描述符列表地址)
- 24位字段,指向流端点描述符列表
- 用于支持多个数据流的批量传输
四、架构关系(结合规范)
┌─────────────────────────────────────────────────────────────────┐
│ Endpoint Context │
│ ├─ MaxPrimaryStreams: 支持的最大主数据流数量 │
│ ├─ LinearStreamArray: 是否使用线性流数组 │
│ └─ StreamContextArrayPointer: Stream Context Array 基地址 │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ Stream Context Array (SSA) │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ StreamContext[0] │ │
│ │ ├─ DequeuePointer → Stream 0 Transfer Ring │ │
│ │ └─ StreamContextType = PRIMARY_TR / SECONDARY_TR │ │
│ └─────────────────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ StreamContext[1] │ │
│ │ ├─ DequeuePointer → Stream 1 Transfer Ring │ │
│ │ └─ StreamContextType = PRIMARY_TR / SECONDARY_TR │ │
│ └─────────────────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ ... (最多支持 255 个流) │ │
│ └─────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
五、Streams 功能的技术要点
5.1 规范要点(3.2.4.1)
- Stream Context Array 的作用:定义 USB3 端点支持的多个传输环
- 数量和位置:由父 Endpoint Context 中的字段定义
- Stream Context 的作用:
- 提供指向 Stream 传输环的指针
- 为 xHC 提供不透明的暂存空间(scratchpad)
5.2 代码实现要点
| 要点 | 说明 |
|---|---|
| 大小固定 | 始终 16 字节,不受 HCCPARAMS.CSZ 影响 |
| 类型多样 | 支持多种 Stream Context Array 大小(8/16/32/64/128/256) |
| 灵活布局 | 支持 Primary/Secondary 传输环类型 |
六、使用场景
USB 3.0 大容量存储设备(如 U 盘)
│
├─ 主端点 (Bulk OUT)
│ └─ Stream Context Array
│ ├─ Stream 0 → 文件 A 传输
│ ├─ Stream 1 → 文件 B 传输
│ ├─ Stream 2 → 文件 C 传输
│ └─ ...
│
└─ 主端点 (Bulk IN)
└─ Stream Context Array
├─ Stream 0 → 文件 A 接收
├─ Stream 1 → 文件 B 接收
└─ ...
七、总结
StreamContext 是 USB 3.0 Streams 技术的核心数据结构,通过以下机制实现多数据流并行传输:
- 扩展传输环数量:单个端点可支持多个独立的传输环
- 独立调度:每个流有自己的 DequeuePointer,独立管理
- 高效批量传输:支持同时传输多个文件/数据流,提升 USB 3.0 带宽利用率
- 灵活配置:支持多种 SSA 大小(8-256 个流)
代码中通过 STREAM_CONTEXT 结构体实现了规范定义,包含传输环指针、流类型标识和端点描述符列表地址等关键字段。
XHCI 1.2b 规范





