Skip to the content.

Mass Storage Gadget (MSG)

1. Overview

海量存储Gadget(或 MSG)充当 USB 海量存储设备,在主机看来就像磁盘或 CD-ROM 驱动器。 它支持多个逻辑单元 (LUN)。 每个LUN的后备存储由常规文件或块设备提供,访问可以限制为只读,并且小工具可以指示它是可移动的和/或CD-ROM(后者意味着只读访问)。

它的要求并不高; 只需要一个批量输入和一个批量输出端点。 内存要求相当于两个 16K 缓冲区。 支持全速、高速和超高速操作。

请注意,该驱动程序稍微不可移植,因为它假设单个内存/DMA 缓冲区可用于批量输入和批量输出端点。 对于大多数设备控制器来说,这不是问题,但有些设备控制器可能存在硬件限制,导致缓冲区无法被多个端点使用。

本文档描述了如何从用户空间使用该小工具、它与大容量存储功能(或 MSF)和使用它的不同小工具的关系,以及它与文件存储小工具(或 FSG)(不再包含在 Linux 中)的区别。 它将仅简要讨论如何在复合小工具中使用 MSF。

2. Module parameters

大容量存储小工具接受以下大容量存储特定模块参数:

除了上述内容之外,该小工具还接受复合框架定义的以下参数(它们对于所有复合小工具都是通用的,因此只是一个快速列表):

3. sysfs entries

对于每个逻辑单元,小工具都会在 sysfs 层次结构中创建一个目录。 在其中创建以下三个文件:

除此之外,像往常一样,模块参数的值可以从 /sys/module/g_mass_storage/parameters/* 文件中读取。

4. Other gadgets using mass storage function

海量存储小工具使用海量存储功能来处理海量存储协议。 作为一个复合函数,MSF 也可以被其他小工具使用(例如 g_multi 和 acm_ms)。

前面部分中的所有信息对于使用 MSF 的其他小工具都有效,但可能缺少对大容量存储相关模块参数的支持,或者参数可能具有前缀。 要弄清楚这是否属实,需要查阅该小工具的文档或其源代码。

有关如何在小工具中包含大容量存储功能的示例,可以查看 Mass_storage.c、acm_ms.c 和 multi.c(按复杂性排序)。

5. Relation to file storage gadget

海量存储功能以及海量存储小工具都是基于文件存储小工具的。 两者的区别在于MSG是一个复合设备(即使用复合框架),而文件存储设备是一个传统设备。 从用户空间的角度来看,这种区别并不重要,但从内核黑客的角度来看,这意味着 (i) MSG 不会重复处理基本 USB 协议命令所需的代码,并且 (ii) MSF 可以在任何其他组合中使用 小工具。

因此,文件存储小工具已在 Linux 3.8 中删除。 所有用户都需要过渡到大容量存储小工具。 从外部看,这两个小工具的行为基本相同,除了:

  1. 在 FSG 中,“可移动”和“cdrom”模块参数为所有逻辑单元设置标志,而在 MSG 中,它们接受每个逻辑单元的 y/n 值列表。 如果仅使用单个逻辑单元,这并不重要,但如果有多个逻辑单元,则需要为每个逻辑单元重复 y/n 值。

  2. FSG 的“serial”、“vendor”、“product”和“release”模块参数在MSG 中由分别命名为“iSerialnumber”、“idVendor”、“idProduct”和“bcdDevice”的复合层参数处理。

  3. MSG 不支持 FSG 的测试模式,因此不支持“transport”、“protocol”和“buflen”FSG 的模块参数。 MSG 始终使用仅批量传输模式和 16 KiB 缓冲区的 SCSI 协议。