菜鸟科技网

USB与SCSI命令如何协同工作?

USB 本身不直接执行 SCSI 命令,但 USB 存储设备(如 U 盘、移动硬盘)内部通常使用 SCSI 协议来管理其闪存或磁盘。

USB与SCSI命令如何协同工作?-图1
(图片来源网络,侵删)

它们之间通过一个叫做 “USB 大容量存储类” (USB Mass Storage Class, UMSC) 的标准桥接起来。


两个独立的概念:USB 和 SCSI

我们需要明白它们是两种不同层面的技术:

USB (Universal Serial Bus - 通用串行总线)

  • 是什么:一种外设总线标准,它定义了物理接口(Type-A, Type-C 等)、电气信号、数据传输方式和通信协议。
  • 作用:为计算机和外部设备(如键盘、鼠标、打印机、U 盘、摄像头)提供一个标准化的连接通道。
  • 视角:它像一个“公路系统”,负责把数据包(货物)从源头(CPU/内存)运送到目的地(设备)或反之,它关心的是“如何运输”,而不是“运输的是什么”。

SCSI (Small Computer System Interface - 小型计算机系统接口)

  • 是什么:一种设备级命令集和协议标准,它定义了如何与存储设备(如硬盘、光驱、磁带机)进行通信,告诉设备要执行什么操作,如“读取扇区 100-200 的数据”或“写入数据到扇区 300”。
  • 作用:为存储设备提供一套标准化的指令集。
  • 视角:它像一个“订单和语言”,它规定了你给设备下什么指令(命令),以及设备如何响应,它关心的是“要做什么操作”。

桥接者:USB 大容量存储类 (UMSC)

既然 USB 只管运输,SCSI 只管命令,U 盘(一种 USB 设备)是如何理解 SCSI 命令的呢?

答案就是 USB Mass Storage Class (UMSC) 协议。

USB与SCSI命令如何协同工作?-图2
(图片来源网络,侵删)

你可以把 UMSC 想象成一个“翻译官”,它位于 USB 协议和 SCSI 协议之间。

工作流程如下:

  1. 操作系统 (如 Windows, macOS, Linux) 想要对 U 盘进行操作,比如拷贝一个文件。
  2. 操作系统并不直接和 USB 通信,而是通过通用存储驱动程序(如 disk.sys 在 Windows 中)发出SCSI 命令,它会发出一个“读取逻辑块地址 512 处的 512 字节数据”的 SCSI Read (10) 命令。
  3. 这个 SCSI 命令被打包成一个 Command Block Wrapper (CBW) 数据包。
  4. 这个 CBW 数据包通过 USB 总线发送到 U 盘,USB 只是把 CBW 当作一个普通的“数据包”来运输。
  5. U 盘内部的主控芯片(一个微控制器 MCU)运行着固件,这个固件实现了 UMSC 协议。
  6. UMSC 协议在 U 盘端扮演“逆向翻译官”的角色,它接收到 CBW 数据包后,从中解包出原始的 SCSI 命令。
  7. U 盘主控芯片执行这个 SCSI 命令,它会根据命令中的地址和长度,从内部的闪存芯片中读取数据。
  8. 读取完成后,U 盘将数据打包成一个 Command Status Wrapper (CSW) 数据包(包含数据和执行状态),再通过 USB 总线发送回计算机。
  9. 计算机端的 USB 驱动程序接收到 CSW,UMSC 协议从中解包出数据,并将最终结果返回给操作系统。

常见的 SCSI 命令示例

即使你是在使用一个 U 盘,当你进行文件操作时,底层的存储设备实际上也在执行这些经典的 SCSI 命令:

  • READ (6) / READ (10) / READ (16):读取指定逻辑块地址的数据,这是最常用的命令之一。READ(10) 可以访问高达 2TB 的空间(2^28 个扇区),而 READ(16) 则支持更大容量。
  • WRITE (6) / WRITE (10) / WRITE (16):向指定逻辑块地址写入数据。
  • TEST UNIT READY:检查设备是否已准备好接收命令,通常在初始化或超时后使用。
  • INQUIRY:请求设备的基本信息,如厂商、产品型号、序列号等,操作系统在识别设备时会用到这个命令。
  • MODE SENSE / MODE SELECT:获取或设置设备的操作参数,如写入缓存是否启用、磁盘扇区大小等。
  • READ CAPACITY:获取设备总容量信息,如逻辑块大小和总块数,这是操作系统确定磁盘大小的关键命令。
  • START STOP UNIT:启动或停止设备(关闭硬盘的电机)。
  • PREVENT ALLOW MEDIUM REMOVAL:锁定或解锁可移除介质(对于 U 盘,这通常表现为“安全弹出”功能的前置步骤)。

USB 大容量存储类的变体

虽然 SCSI 是最经典的底层协议,但 UMSC 协议也支持其他几种设备级命令集,以适应不同类型的存储介质:

  • Transparent SCSI Command Set (最常见):如上所述,直接桥接 SCSI 命令,适用于大多数 U 盘、SD 读卡器、移动硬盘。
  • RBC (Reduced Block Commands):精简版的块命令集,主要用于光驱和磁带机等。
  • 0 (ATA Command Set):直接桥接 ATA 命令(也就是我们常说的 IDE/PATA 硬盘的命令),一些早期的移动硬盘盒或直接使用笔记本硬盘的设备会使用这个。
  • QIC-157:主要用于磁带机。

当你插入一个 USB 存储设备时,系统会通过 INQUIRY 命令来确定它使用的是哪种命令集,然后加载相应的驱动程序。


如何查看和调试这些命令?(高级内容)

如果你是开发者或高级用户,可以使用工具来观察这些底层的 SCSI 命令:

  • Linux:
    • sg3_utils 工具集:sg_raw 可以手动发送原始 SCSI 命令。sg_inq 可以执行 INQUIRY 命令。
    • dmesgjournalctl:可以查看内核识别和与设备通信时的日志信息。
  • Windows:
    • WinUSBlibusb 配合工具:可以使用 usbhid-dump 等工具来观察 USB 流量,但直接观察 SCSI 命令比较复杂。
    • OSR Driver 提供的 USB 分析工具:可以深入分析 USB 通信,包括 UMSC 的 CBW/CSW 包。
  • macOS:
    • system_profiler SPCIDataType:可以列出已连接的 SCSI 设备及其信息。
    • iostat -x:可以观察磁盘 I/O 统计信息。
特性 USB (通用串行总线) SCSI (小型计算机系统接口)
层级 总线/传输层 命令/协议层
作用 定义物理连接和数据如何传输 定义与存储设备如何通信的指令集
关系 USB 是公路,SCSI 是语言,两者通过 USB 大容量存储类 (UMSC) 协议桥接。
命令 无,只有数据包传输、控制传输、中断传输等。 有丰富的命令集,如 READ, WRITE, INQUIRY 等。
设备 U 盘、键盘、鼠标等所有 USB 设备。 硬盘、光驱、磁带机等存储设备。

USB 提供了通往 U 盘的“路”,而 SCSI 是路上跑的“车”所使用的“交通规则和语言”,当你在电脑上操作 U 盘时,实际上是在通过 USB 这条路,用 SCSI 这套语言在和 U 盘内部的控制器对话。

分享:
扫描分享到社交APP
上一篇
下一篇