USB协议学习(三)大容量存储设备SCSI协议分析

news2024/11/16 19:58:20

笔者来简单介绍一下SCSI得协议命令

1、SCSI协议认识

  • SCSI:Small Computer System Interface,用于计算机外部设备得接口标准,定义了与外部设备得一套协议。
  • SCSI标准协议族支持很多钟SCSI设备,像盘,打印机,扫描仪等等)。这个标准定义了一个支持所有SCSI设备得设备模型。其他SCS命令标准扩展了通用得SCSI设备模型,以满足适配特定得SCIS设备。
  • SCSI用CDB来描述命令协议,CDB:command description block,主要有6字节、10字节、12字节、16字节命令协议。通常第一个字节用于描述命令码、操作码。
  • lun:logci unit number,逻辑单元号,指逻辑设备ID,通过该ID可以寻找SCSI下面挂载的设备。

2、SCSI协议命令

首先介绍一下CDB命令格式以及参数得意义,然后介绍各自SCSI命令。

2.1 、CDB命令格式

比如6字节命令。

  • OPERATION CODE:操作码
  • LOGICAL BLOCK ADDRESS:逻辑块地址,以块为单位的地址,例如块大小为4K,那么1的地址就是0x1000,2就是0x2000,
  • TRANSFER LENGTH / PARAMETER LIST LENGTH/ ALLOCATION LENGTH:传输长度/参数长度/分配长度,传输的长度也是以块为单位的,块的大小,总共地址的大小,可以通过read Capcacity来读取回来。
  • CONTROL:控制type,所有的命令都有。
    在这里插入图片描述
    可以看到6字节 的块地址只占2个Byte,length 只占1个Byte,所以其寻址的范围是有限的。
    例如:Block_Size = 0x1000
  • Block_addr_end = 0x10000 * 0x1000 = 256M B。
  • 一次读的数据长度也有限制, 0x100*0x1000 =1MB。
    对于大容量存储的设备来说,明显不够,所以后面由推出了10Byte、12Byte、16Byte、32Byte的命令格式。
    在这里插入图片描述
    在这里插入图片描述
    由上图来看,明显是增加了logic block address 的位数以及length的位数,可以访问的地址范围更大,
  • address:4Byte,end = 16TB,还是以Block Size=4K来算。
  • length:4Byte,

2.2 、CDB具体命令

2.2.1 Test_Unit_Ready

用来询问设备是否处于ready状态,是否可以正常接收媒介数据访问命令并正确处理。

  • 注意其不是一个请求自我测试的命令
  • 可以通过start unit命令让其处于ready状态。
  • 如果处于不可操作的状态,则会返回NOT Ready的sense key。
    在这里插入图片描述
    命令直接填个00就可以,比较简单。
    在这里插入图片描述
    如果是ready状态,device不回复SCSI的数据。从下面代码中可以看到,如果是异常会,返回NOT_Ready的Sense key。
static int8_t SCSI_TestUnitReady(uint8_t lun, uint8_t *params)
{
  
  /* case 9 : Hi > D0 */
  if (MSC_BOT_cbw.dDataLength != 0)
  {
    SCSI_SenseCode(MSC_BOT_cbw.bLUN, 
                   ILLEGAL_REQUEST, 
                   INVALID_CDB);
    return -1;
  }  
  
  if(USBD_STORAGE_fops->IsReady(lun) !=0 )
  {
    SCSI_SenseCode(lun,
                   NOT_READY, 
                   MEDIUM_NOT_PRESENT);
    return -1;
  } 
  MSC_BOT_DataLen = 0;
  re
2.2.2 Inquiry

在这里插入图片描述

  • Length:可以填35,获取标准的厂商设备信息查询
  • 其他字段都可以填0
    响应格式:
  • Device Type:存储设备类型
  • length:返回的数据长度
  • verdor : 厂商信息
  • product:产品信息
  • product version:版本信息
    在这里插入图片描述
    在这里插入图片描述
    一般标志的设备信息,都默认36字节,如果多个设备,通过lun去偏移。

//USB Mass storage 标准查询数据(每个lun占36字节)
const int8_t  STORAGE_Inquirydata[] = { 
  
	/* LUN 0 */ 
	0x00,		
	0x80,		
	0x02,		
	0x02,
	(USBD_STD_INQUIRY_LENGTH - 4),
	0x00,
	0x00,	
	0x00,
    /* Vendor Identification */
    'A', 'L', 'I', 'E', 'N', 'T', 'E', 'K', ' ',//9字节
    /* Product Identification */
    'S', 'P', 'I', ' ', 'F', 'l', 'a', 's', 'h',//15字节
    ' ','D', 'i', 's', 'k', ' ',
    /* Product Revision Level */	
    '1', '.', '0', ' ',							//4字节		
	
	/* LUN 1 */
	0x00,
	0x80,		
	0x02,		
	0x02,
	(USBD_STD_INQUIRY_LENGTH - 4),
	0x00,
	0x00,	
	0x00,
	/* Vendor Identification */
	'A', 'L', 'I', 'E', 'N', 'T', 'E', 'K',' ',	//9字节
	/* Product Identification */				
    'N', 'A', 'N', 'D', ' ', 'F', 'l', 'a', 's', 'h',//15字节
	' ','D', 'i', 's', 'k', 
    /* Product Revision Level */
	'1', '.', '0' ,' ',                      	//4字节
	
	/* LUN 2 */
	0x00,
	0x80,		
	0x02,		
	0x02,
	(USBD_STD_INQUIRY_LENGTH - 4),
	0x00,
	0x00,	
	0x00,
	/* Vendor Identification */
	'A', 'L', 'I', 'E', 'N', 'T', 'E', 'K',' ',	//9字节
	/* Product Identification */				
	'S', 'D', ' ', 'F', 'l', 'a', 's', 'h', ' ',//15字节
	'D', 'i', 's', 'k', ' ', ' ',  
    /* Product Revision Level */
	'1', '.', '0' ,' ',                      	//4字节
}; 

static int8_t  SCSI_Inquiry(uint8_t lun, uint8_t *params)
{
  uint8_t* pPage;
  uint16_t len;
  
  if (params[1] & 0x01)/*Evpd is set*/
  {
    pPage = (uint8_t *)MSC_Page00_Inquiry_Data;
    len = LENGTH_INQUIRY_PAGE00;
  }
  else
  {
    
    pPage = (uint8_t *)STORAGE_Inquirydata[lun * USBD_STD_INQUIRY_LENGTH];
    len = pPage[4] + 5;
    
    if (params[4] <= len)
    {
      len = params[4];
    }
  }
  MSC_BOT_DataLen = len;
  
  while (len) 
  {
    len--;
    MSC_BOT_Data[len] = pPage[len];
  }
  r
2.2.3 Read

read10命令
主要关注的 address、length,其他填0,可以读device中的数据。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.2.4 Write

write10命令。
主要关注的 address、length,其他填0,可以向device写数据。
在这里插入图片描述

2.2.5 ReadCapacity

read10 命令:获取device设备的容量以及块大小。
PMI以及 LBA均填0则行。
在这里插入图片描述
响应值:
returned logical block address:返回的最大的逻辑块的地址
在这里插入图片描述
在这里插入图片描述
由下面代码可以看出,返回的就是逻辑块的size和逻辑块的最大地址。

int8_t STORAGE_GetCapacity (uint8_t lun, uint32_t *block_num, uint32_t *block_size)
{     
	switch(lun)
	{
		case 0://SPI FLASH
			*block_size=512;  
			*block_num=1024*1024*25/512;	//SPI FLASH的前面25M字节,文件系统用
			break;
		case 1://NAND FLASH
			*block_size=512;  
			*block_num=nand_dev.valid_blocknum*nand_dev.block_pagenum*nand_dev.page_mainsize/512;
  			break;
		case 2://SD卡
			*block_size=512;  
			*block_num=SDCardInfo.CardCapacity/512; 
			break; 
	}  	
	return 0; 
} 
static int8_t SCSI_ReadCapacity10(uint8_t lun, uint8_t *params)
{
  
  if(USBD_STORAGE_fops->GetCapacity(lun, &SCSI_blk_nbr[lun], &SCSI_blk_size) != 0)
  {
    SCSI_SenseCode(lun,
                   NOT_READY, 
                   MEDIUM_NOT_PRESENT);
    return -1;
  } 
  else
  {
    
    MSC_BOT_Data[0] = (uint8_t)((SCSI_blk_nbr[lun] - 1) >> 24);
    MSC_BOT_Data[1] = (uint8_t)((SCSI_blk_nbr[lun] - 1) >> 16);
    MSC_BOT_Data[2] = (uint8_t)((SCSI_blk_nbr[lun] - 1) >>  8);
    MSC_BOT_Data[3] = (uint8_t)(SCSI_blk_nbr[lun] - 1);
    
    MSC_BOT_Data[4] = (uint8_t)(SCSI_blk_size >>  24);
    MSC_BOT_Data[5] = (uint8_t)(SCSI_blk_size >>  16);
    MSC_BOT_Data[6] = (uint8_t)(SCSI_blk_size >>  8);
    MSC_BOT_Data[7] = (uint8_t)(SCSI_blk_size);
    
    MSC_BOT_DataLen = 8;
    return 0;
  }
}

2.2.6 Request SenseCode

用来请求sense data,sense data则是记录通信过程中的错误信息。
DESC Bit:用来决定返回的响应值是哪种格式。
在这里插入图片描述
主要关注三个值即可。
SENSE KEY
ADDITIONAL SENSE CODE
ADDITIONAL SENSE CODE QUALIFIER
可以依次理解为:主错误码、子错误码和子子错误码的意思。
如果DESC置1,则是下面这张响应格式
在这里插入图片描述
如果是0,则是固定的格式
在这里插入图片描述

3、SCSI协议命令测试

3.1 Test_Unit_Ready

主机询问是否TestReady,从机什么都不回复就正常,如果有异常,csw 会返回failed,从而通过sense key返回错误状态。
在这里插入图片描述
如果data length不等于0,则会返回无效请求的错误信息。
在这里插入图片描述
此时csw 会返回failed的status=1,然后就会通过sense data来知道是什么错误信息。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
sense key = 0x5,无效的请求
ASC= 0x20,无效的CDB命令。
正常Test unit ready命令,data len = 0,但是上面的cbw data transfer length =8,就会引发device回复错误,看上面代码。

3.2 ReadCapacity

在这里插入图片描述
最大的地址=0xC800,50K个块数据
块size = 0x200,512Byte

3.3 Write

地址=0x010000 ,长度为512。
在这里插入图片描述

3.4 Read

块size = 0x200,所以read的len=0x1,则data length 需要设置512,否则就会报错。
然后通过write写进去的数据,可以通过read读出来。
在这里插入图片描述

3.5 Inquiry Data

需要设置读取的数据长度是多少,返回的数据就是多少,如果是0,肯呢个会出现异常。
在这里插入图片描述

4、BusHound 抓包说明

1、勾选Devices,就可以抓对应设备的USB协议包
在这里插入图片描述
2、选择Setting

  • 可以选择需要抓的包的类型,比如SCSI Command,USB control transfer命令,
  • 也可以修改左上角的抓包限制,改最大,避免抓包的长度太小,没有记录到需要的数据。
  • 左下角可以选择触发暂停,比如下图中出现无效的命令时暂停,
    在这里插入图片描述
    3、选择Capature,点击start,就可以看到抓包的数据。
    在这里插入图片描述
    4、点击Devices,双击设备,可以出现Bus Commander,可以用来发送USB命令或者SCSI命令,方便调试协议。
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1507141.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

算法-双指针、BFS与图论-1224. 交换瓶子

题目 思路 可以交换任意两个瓶子&#xff0c;最多n-1次&#xff1b;如果是只能交换相邻的瓶子&#xff0c;那么相当于逆序对的个数&#xff08;这篇博客是介绍如何计算逆序对的算法&#xff1a;算法篇&#xff1a;逆序对_逆序对算法-CSDN博客&#xff09;本题转换为图论去看:边…

【C++】类和对象(六个默认成员函数)

文章目录 类的六个默认成员函数**构造函数****构造函数的目的****构造函数的特性** 析构函数析构函数概念析构函数处理的顺序析构函数清理细节 拷贝构造函数拷贝构造函数典型调用场景 赋值运算符重载运算符重载赋值运算重载前置和后置 重载 const成员函数再提权限的问题: 取地址…

HAproxy反向代理与负载均衡

目录 一、HAproxy介绍 1. 概述 2. 关于4/7层负载均衡 2.1 无负载均衡 2.1.1 图示 2.1.2 说明 2.2 四层负载均衡 2.2.1 图示 2.2.2 说明 2.3 七层负载 2.3.1 图示 2.3.2 说明 3. 特性 4. HAProxy负载均衡常见策略 5. 处理模式 二、HAproxy安装 1. yum安装 2. 第…

文献阅读笔记:全卷积神经网络

文献阅读笔记&#xff1a;全卷积神经网络 摘要Abstract1. 全卷积神经网络1.1 文献摘要1.2 全卷积神经网络1.2.1 网络结构1.2.0 从分类器到密集 FCN1.2.2 上采样 Upsampling1.2.3 跳级结构1.2.4 FCN训练 1.3 实验1.4 总结 2. 代码实现 摘要 本周学习了全卷积神经网络&#xff0…

模板不存在:./Application/Home/View/OnContact/Index.html 错误位置

模板不存在:./Application/Home/View/OnContact/Index.html 错误位置FILE: /home/huimingdedhpucixmaihndged5e/wwwroot/ThinkPHP123/Library/Think/View.class.php  LINE: 110 TRACE#0 /home/huimingdedhpucixmaihndged5e/wwwroot/ThinkPHP123/Library/Think/View.class.php(…

关于迁移数据库的一些问题

开发人员&#xff0c;并且需要将数据库迁移到另一个分库&#xff0c;尽量采取以下步骤&#xff1a; 备份源数据库&#xff1a; 在进行任何操作之前&#xff0c;首先要确保对源数据库进行备份&#xff0c;以防止意外数据丢失或损坏。 创建目标分库&#xff1a; 在目标数据库服务…

mockjs学习

1.前言 最近面试发现之前团队协同合作的项目没有mock数据难以向面试官直接展示&#xff0c;所以迟到得来速学一下mockjs。 参考视频&#xff1a;mockJs 妈妈再也不用担心我没有后端接口啦_哔哩哔哩_bilibili 一开始查阅了一些资料&#xff0c;先是看了下EasyMock&#xff0c…

windows安装ElasticSearch踩坑记

ElasticSearch是一个开源的分布式搜索和分析引擎。它提供实时分布式搜索功能&#xff0c;可以索引和搜索大量的结构化和非结构化数据。Elasticsearch以其速度、可伸缩性和处理复杂查询的能力而闻名。它常用于日志分析、全文搜索、文档搜索和数据分析等领域。使用ElasticSearch的…

AHU 算法分析 实验四 动态规划

实验四&#xff1a;动态规划 实验目的 • 理解动态规划的基本思想&#xff0c;理解动态规划算法的两个基本要素最 优子结构性质和子问题的重叠性质。 • 熟练掌握典型的动态规划问题。 • 掌握动态规划思想分析问题的一般方法&#xff0c;对较简单的问题能正确 分析&#x…

Day31:安全开发-JS应用WebPack打包器第三方库JQuery安装使用安全检测

目录 打包器-WebPack-使用&安全 第三方库-JQuery-使用&安全 思维导图 JS知识点&#xff1a; 功能&#xff1a;登录验证&#xff0c;文件操作&#xff0c;SQL操作&#xff0c;云应用接入&#xff0c;框架开发&#xff0c;打包器使用等 技术&#xff1a;原生开发&…

章六、集合(1)—— 概念、API、List 接口及实现类、集合迭代

零、 关闭IDEA调试时自动隐藏空元素 一、 集合的概念 存储一个班学员信息&#xff0c;假定一个班容纳20名学员 当我们需要保存一组一样&#xff08;类型相同&#xff09;的元素的时候&#xff0c;我们应该使用一个容器来存储&#xff0c;数组就是这样一个容器。 数组有什么缺…

简析内部审计数字化转型的方法和路径

简析内部审计数字化转型的方法和路径 内部审计是一种独立的、客观的确认和咨询活动&#xff0c;包括鉴证、识别和分析问题以及提供管理建议和解决方案。狭义的数字化转型是指将企业经营管理和业务操作的各种行为、状态和结果用数字的形式来记录和存储&#xff0c;据此再对数据…

基于纳什谈判理论的风–光–氢多主体能源系统合作运行方法(含matlab代码)

目录 主要内容 部分代码 结果一览 下载链接 主要内容 程序解决的是一个基于合作博弈的风光氢能源交易的问题&#xff0c;首先&#xff0c;考虑主体间的电能交易建立各主体的优化运行模型&#xff0c; 然后基于纳什谈判理论建立风–光–氢多主体合作运行模型&…

Springboot+vue的高校危化试剂仓储系统(有报告)。Javaee项目,springboot vue前后端分离项目。

演示视频&#xff1a; Springbootvue的高校危化试剂仓储系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#x…

(003)SlickEdit Unity的补全

文章目录 步骤XML知识点 附录 步骤 1.下载 unity 源码。 2.将自定义文件 MonoBehaviour.cs 放到解压后的项目里面&#xff1a; using System;namespace UnityEngine {public partial class MonoBehaviour{public virtual void Awake(){throw new NotImplementedException();…

Axure原型设计项目效果 全国职业院校技能大赛物联网应用开发赛项项目原型设计题目

目录 前言 一、2022年任务书3效果图 二、2022年任务书5效果图 三、2022年国赛正式赛卷 四、2023年国赛第一套样题 五、2023年国赛第二套样题 六、2023年国赛第三套样题 七、2023年国赛第四套样题 八、2023年国赛第七套样题 九、2023年国赛正式赛题&#xff08;第八套…

flink重温笔记(十四): flink 高级特性和新特性(3)——数据类型及 Avro 序列化

Flink学习笔记 前言&#xff1a;今天是学习 flink 的第 14 天啦&#xff01;学习了 flink 高级特性和新特性之数据类型及 avro 序列化&#xff0c;主要是解决大数据领域数据规范化写入和规范化读取的问题&#xff0c;avro 数据结构可以节约存储空间&#xff0c;本文中结合企业真…

RabbitMQ - 06 - Topic交换机

目录 控制台创建队列与交换机 编写消费者方法 编写生产者测试方法 结果 Topic交换机与Direct交换机基本一致 可参考 这篇帖子 http://t.csdnimg.cn/AuvoK topic交换机与Direct交换机的区别是 Topic交换机接收的消息RoutingKey必须是多个单词&#xff0c;以 . 分割 Topic交…

练习01-登录注册(简单)

一、用户登录/注册实现 综合前面学的知识来实现简单的注册登录功能 1.准备工作 注册登录页面 数据库&#xff0c;数据表 mybatis 坐标引入&#xff0c;MySQL驱动 配置 映射文件 用户实体类 Servlet代码 2.页面 不想手写的可以看博主IT黄大大【带源码】 【炫酷登录界…

贝叶斯优化CNN-GRU回归预测(matlab代码)

贝叶斯优化CNN-GRU回归预测matlab代码 贝叶斯优化方法则采用贝叶斯思想&#xff0c;通过不断探索各种参数组合的结果&#xff0c;根据已有信息计算期望值&#xff0c;并选择期望值最大的组合作为最佳策略&#xff0c;从而在尽可能少的实验次数下达到最优解。 数据为Excel股票…