如何限制在 Write_10 命令中写入的块数?

How can I limit the number of blocks written in a Write_10 command?

我有一个基本上是基于 NXP LPC18xx 微控制器的 USB 闪存驱动器的产品。我正在使用制造商 (LPCOpen) 提供的库来处理 USB MSC 和 SD 卡媒体(这是我存储数据的地方)。

问题是:LPC18xx 内部有一个 64kB(受硬件限制)缓冲区用于缓存 reads/writes,这意味着它最多只能缓存 128 个块(512B)的内存。 SCSI Write-10 命令有一个 total-blocks 字段,最多可达 256 个块 (128kB)。最初在 Windows 7 上测试产品时,它一次不会写入超过 128 个块,但在 Linux 上测试时,有时会写入超过 128 个块,这会导致微控制器崩溃。

有没有办法告诉主机OS不要请求超过128个块?我看到参考文献 [1] 中有一个 Read-Block-Limit command(05h),但它似乎没有得到广泛支持。另外,我会在 Write-10 命令上 return 告诉 Linux 写入太大?我还在一些设备规格表中看到了对块限制 VPD 页面的引用,但找不到很多关于它是如何实现的文档。

[1]https://en.wikipedia.org/wiki/SCSI_command

让我先提供一个免责声明,这是您应该做的,但是 none 这可能会奏效。粗略搜索 Linux SCSI 驱动程序并没有显示我想要看到的内容。所以,我完全不确定 "doing the right thing" 是否会给您带来您想要的结果。

照章办事,您必须做两件事:实施块限制 VPD 并在写入和读取中处理过大的传输大小。

首先,实现 Block Limits VPD 页面,您可以在 Internet 上流传的 SBC-3 最新修订版中找到该页面(例如:http://www.13thmonkey.org/documentation/SCSI/sbc3r25.pdf). It's probably worth going to the t10.org site, registering, and then downloading the last revision (http://www.t10.org/cgi-bin/ac.pl?t=f&f=sbc3r36.pdf)。

Block Limits VPD 页面有一个最大传输长度字段,它指定了所有 READ 和 WRITE 命令以及基本上任何其他读取或写入数据的命令可以传输的最大块数。当然,实施此页面的缺点是您必须确保 return 所有其他字段都是正确的!

其次,在处理READ 和WRITE 时,如果命令的传输长度超过您的最大值,则使用ILLEGAL REQUEST 键响应,并将附加检测代码设置为INVALID FIELD IN CDB。此行为在描述块限制 VPD 的部分中由 table 指示,但仅在 SBC-3 的最新修订版中(我正在查看 35h)。

您可能只是从 returning CDB 中的无效字段开始,因为这是最简单的操作过程。看看够不够?