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

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.xdnf.cn/news/10142.html

相关文章:

  • 【大模型面试每日一题】Day 32:位置编码的改进方向与Rotary Position Embedding的核心优势
  • Augment vs Cursor:当Cursor解决不了问题时的最佳补充方案
  • CPT302-2425-S2-Multi-Agent Systems
  • Java基础 Day25
  • C++中IO类条件状态知识详解和注意事项
  • github访问慢
  • shell中与>和<相关的数据流重定向操作符整理
  • Q: dify知识库模块主要库表和字段
  • cf每日刷题c++
  • centos7.6阿里云镜像各个版本介绍
  • 【软件安装那些事 3 】CAD(2026 V60.7z) 安装教程(中文简体版)步骤完整不跳步 { 附软件提取下载链接,永久有效---------百度网盘 }
  • @Pushgateway配置与使用
  • 广东省林学会新办林业造林资质具体条件?
  • 1 Studying《Java编程思想》
  • 现代密码学 | 高级加密标准(AES)
  • Java枚举详解:从基础到高级应用
  • Keil MDK5.37或更高版本不再预装ARM Compiler Version5导致编译错误的解决方法
  • 2025最新版|八股文面试题库+答案详解(附高频考点解析)
  • Python 训练营打卡 Day 30-模块和库的导入
  • VirtualBox给Rock Linux9.x配置网络
  • Python-118:有限制的楼梯攀登
  • 如何把TikTok的视频下载到本地?
  • 企业应用AI对向量数据库选型思考
  • 华院计算出席信创论坛,分享AI教育创新实践并与燧原科技共同推出教育一体机
  • Ubuntu系统下可执行文件在桌面单击运行教程
  • type system_app, domain, coredomain; 和 typeattribute system_app coredomain; 区别
  • 《操作系统真相还原》——加载器
  • pikachu通关教程-RCE
  • ACS期刊的投稿查重要求
  • PHP 垃圾回收高级特性