SATA ACS-3 General Feature 之 Write-Read-Verify feature Set

一、基础知识

1.功能描述

  a.主要功能为允许主机控制设备中的写后读行为。
  b.Write-Read_verify Supported bit表示是否支持此功能集;Write-Read-Verify Enabled bit表示此功能集的支持、启用或禁用状态。以上字段均在Identify中定义。
  c.主机可以发送Set Feature enable/disable Write-Read-Verify 功能集子命令来启用和禁用Write-Read_Verify功能集。
  d.若设备的易失性写缓存被启用,即使数据在VWC中并且未写入非易失性介质,设备也可以无错误的将命令完成返回给主机。
  e.若易失性写缓存禁用、有FUA写入命令、Flush命令,只有当数据经过验证后才返回命令完成。
  f.如果启用了Write-Read-Verify功能集,并且设备尚未验证为此功能集配置的最大逻辑扇区数,则在设备将逻辑扇区写入非易失性介质后,设备应从非易失性介质读取数据并验证没有错误。在验证之前,应从非易失性介质中读取数据。逻辑扇区的验证是特定于供应商的。
  g.若Write-Read-Verify功能集被禁用,或者设备已经验证了为此功能集配置的最大逻辑扇区数,则在设备将逻辑扇区写入非易失性介质后,不应执行此功能集的验证。
  h.如果设备在写入操作、读取操作或验证操作过程中遇到不可恢复的错误情况,设备应将Device Fault bit设置为1。

2.启用WRV功能后,设备性能可能会下降,受此影响的命令

a.Write DMA
b.Write DMA EXT
c.Write DMA FUA EXT
d.Write FPDMA Queued
e.Write Multiple
f.Write Multiple EXT
g.Write Multiple FUA EXT
h.Write Sector
i.Write Sector EXT

3.启用/禁用Write-Read-Verify Feature

  a.Subcommand code 0Bh是启用该功能,Subcommand code 8Bh是禁用该功能。
  b.Set Feature命令的LBA Bits 7:0字段指定WRV的模式,针对模式1和模式3时,盘片应启动,或者Set Feature设置WRV模式成功且无错误。

LBA field Mode 释义
00h Mode 0 始终启用
01h Mode 1 对写入前65536的逻辑扇区进行校验
02h Mode 2 厂商定义
03h Mode 3 对写入前N个逻辑扇区进行校验;其中n = x * 1024,x由Count字段指定数字
04h-FFh Reserved

  b-1.在处理Powe-On Reset或者禁用软件设置保存功能集且硬件复位后,设备应将Write-Read-Verify功能集设置未出厂默认设置;若启用了软件设置保存功能集且硬件复位,设备不会更改Write-Read-Verify功能集设置。
  b-2.如果设备处于默认启用模式,则处理软件重置后,设备应将写读验证功能设置为出厂默认设置。
  b-3.如果设备处于默认禁用模式,则在处理软件复位后,设备不得更改写-读-验证功能集的设置。
  b-4.如果选择了写-读-验证功能集模式2,则每次启动后要验证的逻辑扇区数量在WRV mode 2 COUNT字段中显示。如果选择了写-读-验证功能集模式3,则每次启动后要验证的逻辑扇区数量将在WRV mode 3 COUNT字段中指示。

二、Linux环境ATA指令操作

1.查看当前设备是否支持Write-Read-Verify

  a.使用sg_sat_Idnetify获取盘片Identify信息,或者使用ata id命令也可;如下所示:

[root@localhost ~]# sg_sat_identify /dev/sdd
Response for IDENTIFY DEVICE ATA command:
 00     0000 0000 0000 0000 0000 0000 0000 0000  
 ......
 50     0ffc 005e 746b 7d01 4163 7469 bc01 4163
 ......
 70     0000 0000 0000 0000 0000 0000 0000 401e
 78     401c 0000 0000 0000 0000 0000 0000 0000
 ......
 f8     0000 0000 0000 0000 0000 0000 0000 0000 
[root@localhost ~]#

  b.通过协议Identify查找到指定的86Word(0x56)位置,其中bit 15代表Word 119...120有效;因为支持Write-Read-Verify的bit在119 Word(0x77)和120 Word(0x78)中。其中119 Word的bit 1代表是否支持Write-Read-Verify功能;120 Word的bit 1代表是否启用Write-Read-Verify功能。

2.启用/关闭Write-Read-Verify feature set

  a.通过Set Feature(EFh)命令,下发feature=0x0B启用Write-Read-Verify功能;通过identify查看120Word(78h)由0x401C变为0x401E,bit 1变为1;下发feature=0x8B禁用Write-Read-Verify功能;通过identify查看120Word(78h)由0x401E变为0x401C,bit 1变为0。

[root@localhost ~]# sg_sat_identify /dev/sdd
Response for IDENTIFY DEVICE ATA command:
 ......
 78     401c 0000 0000 0000 0000 0000 0000 0000     
 ......
[root@localhost ~]#
[root@localhost ~]# ata passthru --protocol=0x3 --feature=0x0B --lba=0x0 --command=0xef /dev/sdd
ATA Command SET FEATURES Success
[root@localhost ~]# sg_sat_identify /dev/sdd
Response for IDENTIFY DEVICE ATA command:
 ......
 78     401e 0000 0000 0000 0000 0000 0000 0000     
 ......
[root@localhost ~]#
[root@localhost ~]# ata passthru --protocol=0x3 --feature=0x8B --lba=0x0 --command=0xef /dev/sdd
ATA Command SET FEATURES Success
[root@localhost ~]# sg_sat_identify /dev/sdd
Response for IDENTIFY DEVICE ATA command:
 ......
 78     401c 0000 0000 0000 0000 0000 0000 0000     
 ......
[root@localhost ~]#

3.启用Write-Read-Verify feature功能,下发写命令

  a.通过指令集下发Write DMA(CAh,DMA)命令,将数据下发,并通过Read DMA(C8h,DMA)读取

[root@localhost ~]#  ata passthru --protocol=0x6 --count=2 --lba=1 --data_len=1024 --command=0xCA -f /home/123 /dev/sdd
ATA Command WRITE DMA Success
[root@localhost ~]#  ata passthru --protocol=0x6 --count=2 --lba=1 --data_len=1024 --command=0xC8 /dev/sdd             
ATA Command READ DMA Success
       00 01 02 03 04 05 06 07  08 09 0a 0b 0c 0d 0e 0f
00000: 30 30 30 30 30 30 30 20  30 30 30 30 20 30 30 30  
......
003f0: 44 65 76 69 63 65 20 3d  3d 20 2d 31 3a 0a 20 20 
[root@localhost ~]#

~文章已经结束了~
声明:本人所写的只是本人在使用中遇到的问题做个记录总结,很多内容也是百度,或者查阅官方文档,可能与他人有重复;若需按照本文配置,请认真确认是否适合你的情况,造成一切损失;本人概不负责。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容