问题标签 [scsi]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
standards - SCSI 感知数据格式和 MODE SENSE 控制页面
SCSI 参考手册定义了两种类型的感知数据格式——固定的和基于可变描述符的(第 2.4 章)。应该作为对 MODE SENSE SCSI 命令的响应返回的“控制模式页面 (0Ah)”(4.3.8) 包含一个 D_SENSE 位,其定义为:
D_SENSE(描述符格式检测数据)位
0 描述符格式感知数据 (D_SENSE) 位设置为零指定设备服务器在返回相同 I_T_L_Q 关联事务中的感知数据作为 CHECK CONDITION 状态时应返回固定格式感知数据。
1 设置为 1 的 D_SENSE 位指定设备服务器在返回与 CHECK CONDITION 状态相同的 I_T_L_Q 关联事务中的感知数据时应返回描述符格式感知数据,除非在 2.4.1 中定义。
我的问题是关于 SCSI 目标端的这个位解释 - 如果这个位是 1,目标服务器是否有义务以描述符格式返回感知数据?或者只是有可能以它想要的任何格式返回这些数据?
感知数据的第一个字节可用于确定其格式,因此 SCSI 发起方实际上并不需要 D_SENSE 位值来决定如何解码接收到的感知数据。
我问这个问题是因为我正在开发一些应该模拟 SCSI 目标的软件,所以我需要消化多个 SCSI 文档以使其正确。
target - 使用同一启动器 IQN 的 ISCSI 多个连接
多台计算机是否可以使用同一个发起方 IQN 同时连接到同一个目标?
谢谢你。
usb - USB SCSI 查询和请求感知
我目前正在为我的操作系统组装笔式驱动器编写 USB(EHCI)驱动程序。我可以成功获取设备、字符串、配置(接口和端点)描述符。但是,SCSI 查询和其他命令失败。这就是我所做的(在 getMaxLUN 之后):
- 设置配置(1)
- 询问
另一种方式:
- 设置配置(1)
- 测试单元就绪
- 请求感知
- 测试单元就绪
我在 QueueHead(BulkIn 或 BulkOut)和设备地址中正确设置了 EndPt。我正在通过“BD Lunt - USB:通用串行总线”一书实现USB驱动程序。如果我发送查询,这就是我得到的(返回缓冲区,36 字节,十六进制):
01 00 00 00 01 00 00 00 80 0D 24 00
40 15 16 00 00 20 16 00 00 30 16 00
00 40 16 00 00 50 16 00 00 00 00 00
第 11 个字节为 0x24,即返回数据的长度(36)。这看起来很垃圾或错误消息。
如果我发送 TestUnitReady,则 RequestSense 返回(18 字节,十六进制):
01 00 00 00 01 00 00 00 80 0D 12 00
C0 16 16 00 00 20
第 11 个字节为 0x12,即返回数据的长度(18)。两个返回缓冲区的内容是相似的。Inquiry 和 TestUnitReady 的 CBW 看起来不错(我使用 LUN=0)。SCSI-spec-4 说明逻辑单元不正确,如果结果不是预期的,但我只有 LUN 0。
我正在使用 Sony 4GB pendrive 进行测试。查询应该立即工作(在缓冲区中返回正确的数据),不管它之后的 CSW,我不明白问题可能是什么。我正在尝试使用 BulkReset 和 Clear_Feature(用于 BulkIn 和 BulkOut),但这似乎并不能解决查询。TestUnitReady 的 CSW 返回 Status=01,但在 BulkReset 和 ClearFeature 之后它返回 Status=0(成功)。
缓冲区中数据不正确的原因是什么?任何帮助表示赞赏。
编辑:我也尝试过延迟(发送 CBW 前 100 毫秒,获取 CSW)。它没有帮助。
EDIT2:在 SetConfiguration(1) 之后立即调用 GetConfiguration(),正确返回 1。
EDIT3:这一定是由于指针不正确。我认为它解决了。
scsi - 为什么 SCSI 标准允许设备同时具有多个“端口”和多个“逻辑单元”?
我试图了解 SCSI 的低级细节。SCSI 标准(例如 SAM-5 SCSI 架构文档)规定单个 SCSI 设备可以有多个“目标端口”,也可以有多个“逻辑单元”。当发起者向目标发送读/写数据的请求时,它需要指定所需的目标端口和逻辑单元号。
似乎只是一个端口号或一个逻辑单元号就足以执行所需的多路复用,因此单个 SCSI 接口可以提供对多个数据源/接收器的访问。
现实世界中的 SCSI 设备是否真的提供了多个目标端口和多个逻辑单元?
如果您可以提供一个具有多个目标端口和一个具有多个逻辑单元的设备的示例,让您了解在实践中使用哪些端口/LUN,那将非常有帮助。
scsi - 对于 SCSI,附加长度的定义是否发生了变化?
我正在阅读 SCSI SPC4r22。关于附加长度,spc3 之前的所有修订版均声明如下(“不得调整”):
来自 spc2r20.pdf:
“附加长度字段应指定参数的字节长度。如果 CDB 的分配长度太小而无法传输所有参数,则不应调整附加长度以反映截断。”
但我在 SPC3 或 SPC4 中没有看到该声明。那是改变了还是我错过了这个短语?如果我错过了它,有人可以引用它吗?
assembly - 来自 USB 的 SCSI 数据包
所以我发现这个链接是否在插入计算机时执行闪存驱动器的第一个扇区(MBR),并且想知道答案中提到的 USB SCSI 数据包的细节。首先,它们存储在闪存驱动器的什么位置?如果我对我的 USB 驱动器进行十六进制转储,我是否能够查看数据包,如果可以,可以查看哪些内存寄存器?第二,如果每个公司使用不同的指令集,计算机如何处理非标准数据包?第三,如何修改驱动器返回的数据包?
scsi - SCSI 写入缓冲区命令“下载带有偏移的微码并保存”与“下载带有保存的微码”模式
我想使用 Write Buffer SCSI 命令上传磁带驱动器 (LTO-6) 的固件。如IBM LTO SCSI 参考部分“5.2.41.6: MODE[07h] – 下载带有偏移量、保存和激活的微码”中所述,使用一个或多个 WRITE BUFFER 命令将微码传输到设备,并保存到非易失性存储器(第 180 页) )。根据 CDB(第 132 页),缓冲区偏移量可以用 3 个字节表示,参数列表长度也是如此。
据我了解,您可能需要使用多个写入缓冲区命令,以防固件大小无法以 3 个字节(超过约 16M)表示,如果是这样,您可以使用偏移量。但是如果偏移量本身不能用超过 3 个字节表示,那就意味着不能在偏移量 17M 处写入(因此不能连续使用该命令超过两次)。
有人知道这是否是“偏移和保存”模式的真正用途吗?
c - 文件描述符关闭后 SCSI 驱动器启动
我有一个程序,其中需要对未安装或以任何其他方式使用的驱动器进行降速。
我注意到在我关闭文件描述符后驱动器会自动启动。
我还没有找到任何信息为什么会这样,有什么办法可以禁用它吗?
这是一个自己测试的简短程序。任何帮助或指示将不胜感激
vmware - VMware ESXi 内核日志文件中的“Bad CDB”消息
我正在运行VMware ESXi 5.5/var/log/vmkernel.log
管理程序,并在其文件中看到很多错误消息,如下所示:
带有代码的 SCSI 操作0x9e
是SERVICE ACTION IN (16)
16 字节的命令。那么,为什么服务器会抱怨max=12
限制呢?收到这些消息的原因可能是什么?我应该改变什么来摆脱它们?
c - 通用 scsi ioctl 后 fread 期间的段错误
背景
我正在编写一个通过 USB 启动嵌入式 ARM 系统的工具。这个特定的 ARM 系统有一个引导加载程序,它可以通过模拟大容量存储设备并实现一些允许主机将信息写入内存的供应商 SCSI 操作码来通过 USB 加载系统。我的工具在嵌入式 ARM 系统所连接的主机上运行,它使用这些供应商命令将 zImage 或其他二进制文件发送到设备。
我使用 Linux 通用 SCSI 接口来发送命令。
在发送一些命令将值写入控制 RAM 控制器的寄存器后,我的程序打开一个文件,然后进入一个循环,在该循环中它一次从文件中读取 4096 个字节,然后将它们发送到设备。
对于需要发送的 SCSI 命令,我没有任何文档。我通过捕获和分析由供应商提供的等效纯 Windows 工具发送的 USB 流量来确定要使用的协议。这个协议有一些奇怪的方面,特别是它接受小端格式的地址和值,并且 SCSI 命令中的 32 位值不是字对齐的,但是我认为这些与手头的问题没有任何关系。
问题
发送前 7 个缓冲区后,程序出现段错误。
段错误的部分如下:
段错误发生在调用 fread。回溯看起来像这样:
我看不出处理文件的方式有什么问题,如果我注释掉对 ak_usbboot_storemem 的调用,那么循环将毫无问题地完成。
ak_usbboot_storemem 看起来像这样:
_sendCmd 看起来像这样:
我猜我正在使用 SCSI Generic IOCTL 做的事情导致了这种情况,但到目前为止我还没有发现任何东西。
欢迎任何见解!