SCSI(Small Computer System Interface)是一套存储设备命令和架构模型;在现代系统里,它不只指老式并行 SCSI 总线,也常指 READ、WRITE、INQUIRY、REQUEST SENSE 等块存储命令语义。
核心问题
操作系统希望用统一方式访问不同存储设备:磁盘、光驱、UFS、USB Mass Storage、SAS 盘等。硬件传输层可以不同,但上层需要一组稳定命令来表达“读哪个逻辑块”“写哪个逻辑块”“查询设备能力”“报告错误原因”。
SCSI 的价值在于把“存储命令语义”抽出来,让不同传输层承载。
核心对象
| 对象 | 作用 |
|---|---|
| initiator | 发起命令的一方,通常是主机。 |
| target | 响应命令的一方,通常是存储设备。 |
| LUN | target 内部的逻辑单元编号。 |
| CDB | Command Descriptor Block,描述一次 SCSI 命令。 |
| sense data | 设备返回的错误和状态解释。 |
| task management | 取消、复位、清队列等任务管理操作。 |
核心机制
一次简化读请求可以表示为:
CDB = READ(lba, transfer_length)
response = target.execute(CDB)lba是逻辑块地址。transfer_length是要读的块数。target.execute表示设备按命令读取并返回数据或错误状态。
在 UFS 中,SCSI 命令会被封装到 UPIU,通过 UTP、UniPro 和 MIPI M-PHY 发给设备。Linux UFS 驱动也接入 SCSI midlayer,因此 UFS 设备在软件栈里常表现为 SCSI 风格的块设备。
工程用途
- 统一不同存储设备的读写和错误语义。
- 在 Linux 中通过 SCSI midlayer 复用错误处理、队列和块设备框架。
- 在 UFS、USB Mass Storage、SAS 等协议里作为上层命令模型。
边界与常见坑
- SCSI 不等于老式并行线缆。现代 SCSI 命令可以跑在 UFS、USB、SAS 等不同传输上。
- SCSI 命令语义不等于底层物理介质。设备内部可能是 NAND Flash、机械盘或虚拟块设备。
- sense data 很关键。只看 I/O error 不看 sense key、ASC/ASCQ,容易丢失真实故障原因。
- UFS 只是使用 SCSI 架构模型,不代表 UFS 设备接在传统 SCSI 总线上。