当前位置: 首页 > article >正文

USB MSC

主机(如电脑)识别USB MSC(Mass Storage Class)设备中的文件,本质上是通过多层协议协作实现的,涉及USB枚举、SCSI命令传输和文件系统解析三个核心环节。以下是详细机制:


🔍 ​一、USB枚举:设备身份识别(主机→设备)​

当USB MSC设备(如U盘)插入主机时,主机通过USB协议进行设备枚举:

  1. 设备描述符获取
    • 主机请求设备描述符(Device Descriptor),确认设备类型(bDeviceClass=0x00,接口类为MSC)。
    • 关键字段:bInterfaceClass=0x08(MSC类)、bInterfaceSubClass=0x06(SCSI指令集)、bInterfaceProtocol=0x50(Bulk-Only传输协议)。
  2. 配置与端点激活
    • 主机获取配置描述符,分配端点(Bulk-In/Bulk-Out端点用于数据传输),完成USB通信通道建立。

✅ ​此阶段目标​:主机确认设备是USB MSC设备,并准备好SCSI命令传输通道。


⚙️ ​二、SCSI命令交互:读取存储结构(主机→设备)​

主机通过SCSI命令集访问存储介质结构,核心命令包括:

SCSI命令操作码功能返回信息
INQUIRY0x12查询设备基本信息(厂商、产品型号)设备属性、兼容性
READ CAPACITY0x25获取存储容量(总扇区数、扇区大小)容量参数(如512字节/扇区)
REQUEST SENSE0x03获取错误状态(用于异常处理)错误代码
READ(10)​0x28读取指定逻辑块地址(LBA)的数据扇区原始数据
关键步骤​:
  1. 读取MBR(主引导记录)​
    • 主机发送 READ(10) 命令,LBA=0,读取磁盘第一个扇区(512字节)。
    • MBR包含分区表​(64字节),记录分区起始LBA、大小及文件系统类型(如FAT32/NTFS)。
  2. 读取DBR(DOS引导记录)​
    • 根据MBR的分区表,主机定位到分区起始扇区(如LBA=2048),再次发送 READ(10) 读取DBR。
    • DBR的BPB(BIOS参数块)​​ 包含文件系统关键参数:
      • bpbResSectors:保留扇区数(FAT表之前的扇区数)
      • bpbFATsecs:每个FAT表大小(扇区数)
      • bpbRootEntCnt:根目录条目数(FAT32中为0)。

📂 ​三、文件系统解析:定位文件(主机操作系统)​

主机操作系统(如Windows/Linux)根据DBR参数解析文件系统:

  1. 定位FAT表与根目录
    • FAT1起始扇区 = 分区起始LBA + 保留扇区数(bpbResSectors)。
    • 根目录起始扇区(FAT32) = FAT1起始扇区 + FAT表数量 × 每个FAT表大小。
  2. 遍历目录条目
    • 根目录的每个条目(32字节)包含:
      • 文件名(8.3格式或长文件名)
      • 文件属性(目录/文件/隐藏)
      • 起始簇号
      • 文件大小。
  3. 文件内容读取
    • 根据起始簇号,在FAT表中查找簇链,通过 READ(10) 命令读取连续簇的数据。

🌰 ​示例​:读取test.txt文件:

  1. 根目录找到条目,获起始簇号=2。
  2. 查FAT表:簇2→簇3→簇4(链式存储)。
  3. 计算簇2的LBA = 数据区起始LBA + (簇号-2) × 每簇扇区数。
  4. 发送 READ(10) 读取对应扇区。

💎 ​总结:主机识别文件的完整流程

[USB设备插入] 
[USB枚举:获取描述符]
[激活Bulk端点]
[SCSI命令传输]
[INQUIRY:设备信息]
[READ CAPACITY:容量]
[READ(10)读取MBR/DBR]
[解析文件系统参数]
[定位FAT表/根目录]
[遍历目录条目]
[按簇链读取文件数据]
http://www.lryc.cn/news/2393556.html

相关文章:

  • css实现文字渐变
  • FART 自动化脱壳框架一些 bug 修复记录
  • 基于Flask实现豆瓣Top250电影可视化
  • More SQL(Focus Subqueries、Join)
  • 项目部署react经历
  • 从图像处理到深度学习:直播美颜SDK的人脸美型算法详解
  • 智能教育个性化学习路径规划系统实战指南
  • spark- ResultStage 和 ShuffleMapStage介绍
  • zTasker一款Windows自动化软件,提升效率:大小仅有10MB,免费无广告
  • 人工智能100问☞第34问:什么是语音识别与合成?
  • 最大流-Ford-Fulkerson增广路径算法py/cpp/Java三语言实现
  • 怎么从一台电脑拷贝已安装的所有python第三方库到另一台
  • 【测试】Bug和用例
  • 缓存穿透、缓存击穿、缓存雪崩目前记录(纯日记)
  • 鸿蒙OS的5.0.1.120版本体验怎么样?
  • 使用ssh-audit扫描ssh过期加密算法配置
  • 前端工程化 Source Map(源码映射)详解
  • 2025.05.28-华为暑期实习第二题-200分
  • Java+Playwright自动化-2-环境准备与搭建-基于Maven
  • 由sigmod权重曲线存在锯齿的探索
  • 二、OpenCV图像处理-图像处理
  • UPS的工作原理和UPS系统中旁路的作用
  • 麒麟系统 Linux(aarch64处理器)系统java项目接入海康SDK问题
  • 深入理解数组索引:原理、应用与优化
  • 【洛谷P9303题解】AC- [CCC 2023 J5] CCC Word Hunt
  • Python图片格式批量转换器教程
  • 从公开到私密:重新思考 Web3 的数据安全
  • 计算机网络常见体系结构、分层必要性、分层设计思想以及专用术语介绍
  • 接口自动化测试用例的编写方法
  • 解决Docker存储空间不足问题