《NVM-Express-1_4-2019.06.10-Ratified》学习笔记(6.5-加-8.2-加-8.3)End-to-end_Data_Protection

6.5 End-to-end Protection Information 端到端保护信息

包含数据转存的命令可以使用端到端数据保护。在这些命令内部【位于Command Dword 12 的 [29:26] 这四个bit位】,保护信息功能和保护信息检查字段域,正如Figure 355中定义做了详细说明。

【注:CDW12.PRINFO即是Figure355描述的4个bit位】

Protection Infomation Action(PRACT):保护信息功能位【只占一个bit位】指示对保护信息要做的行动。只有当namespace使用端到端保护信息来格式化的情况这个bit位才有用。具体请参考8.3章节。

Protection Information Check(PRCHK):保护信息检查字段域指定应该作为端到端数据保护处理的一部分进行检查的区域。只有当namespace使用端到端保护信息来格式化的情况这个PRCHK才有用。

 

【为便于理解端到端数据保护机制的两种配置,此处增加第8.2章节元数据处理的内容】

8.2 Metadata Handling 元数据处理

controller可以支持基于每个逻辑块的元数据。元数据是基于每个逻辑块分配的附加数据。至于主机如何使用元数据区域没有做要求。对元数据最常见的一种用法是表达端到端保护信息。

元数据可以被转存,转存可以是从controller到host或者从host到controller这两种途径的其中之一。在namespace格式化时选择使用的机制。

【1】转存元数据的第一种机制是,作为逻辑块的一个连续的部分【这里说的逻辑块就是与此元数据相关联的逻辑块】。元数据在相关逻辑块的末尾传输,形成一个扩展的逻辑块。Figure449是这种机制的插图。这种情况,逻辑块数据和逻辑块元数据都被PRP1和PRP2所指向(如果使用SGLs的话就是SGL Entry 1)。

 

 

 【2】转存元数据的第二种机制是,元数据作为一个单独的数据缓冲区。Figure450是这种机制的插图。这种情况,元数据由元数据指针所指向,而逻辑块数据 由数据指针所指向。当一个命令在命令中使用PRPs指向元数据时,元数据需要在物理上是连续的。当一个命令在命令中使用SGLs时,元数据不要求在物理上连续。

 

 

对于每个namespace当被格式化时都应该选择转存机制中的其中一个;部分元数据使用一种机制转存另一部分元数据使用另一种机制转存是不支持的。

如果使用了端到端数据保护,那么对于每个逻辑的保护信息域是被包含在元数据中的。

 

8.3 端到端数据保护

为了提供健壮的从应用到NVM介质,以及从NVM介质回到应用自身的数据保护,可以使用端到端数据保护。如果使能了这个机制,额外的保护信息(例如CRC)被添加到逻辑块以确定逻辑块的完整性,或许由controller评估 和/或 host主机软件评估。这些附加的保护信息,如果出现,根据namespace的格式,它位于元数据的前八字节或者尾八字节。【1】对于超过八字节的元数据格式,如果保护信息包含在元数据的前八字节中,那么CRC不涵盖任何元数据字节。【2】对于元数据格式超过八字节,但保护信息包含在元数据的尾八字节中,那么CRC涵盖所有除了CRC这八个字节之外的所有元数据字节。【1和2总结起来,就是CRC只涵盖(计算)CRC之前的字节,不涵盖CRC后边的字节】。像第8.2章节描述的那样,元数据和之后的这个保护信息,可以配置成紧挨着逻辑块数据或者存放到一个单独的缓冲区中。

在企业级实现中最常用的数据保护机制是SCSI Protection Information,众所周知的像 Data Integrity Field(DIF),Data Integrity Extension(DIX)。这两个机制之间的主要差别是保护信息的位置。在DIF中,保护信息紧挨着逻辑块数据,并创建一个扩展逻辑块。而DIX保护信息被保存在单独的缓冲区中。本规范中定义的端到端数据保护机制是DIF和DIX二者功能的兼容。通过配置元数据紧挨着逻辑块数据来实现DIF功能(Figure 449展示),通过配置元数据和数据分别用单独的缓冲区来实现DIX功能(Figure 450展示)。

NVMe支持SBC-3中指定的定义在SCSI Protection信息模型中的相同的端到端保护类型。当格式化namespace时,端到端数据保护的类型(例如Type1、Type2或Type3)是可选的,并在Identify Namespace数据结构(参考Figure245)中记录。

保护信息格式如图Figure 451所示,包含在与每个逻辑块对应的元数据中。Guard域包含一个通过逻辑块数据计算的CRC-16。CRC-16的计算公式定义在SBC-3中。除了RCR-16之外,DIX也指定一个可选的IP checksum,NVMe接口不支持这个。Application Tag是不透明的数据域,不能被controller理解,它可以用于禁止保护信息的检查。Reference Tag把逻辑块数据与一个地址关联起来,防止被误用或者乱序逻辑块传输。类似于Application Tag,Reference Tag也可以用于禁止保护信息的检查。

8.3.1 The PRACT Bit

作为读和写命令的附带功能(副作用)执行的保护信息处理由命令中的保护信息功能(PRACT)位控制。

8.3.1.1 Protection Infomation和Write Commands

图Figure 452提供了一些保护信息处理作为写命令的附带功能出现的例子。

如果namespace没有带端到端数据保护格式化,那么从主机到NVM转存的逻辑块数据和元数据不携带让controller处理相关的保护信息。

如果namespace带保护信息来格式化,并且PRACT位赋值为0,那么逻辑块数据和元数据,元数据包括保护信息,可能还包含额外元数据,从主机缓冲区转存到NVM(即:元数据字段在NVM和主机缓冲区中保持相同的大小)。当逻辑块数据和元数据透传到controller时,保护信息被校验。如果保护信息校验被发现错误,命令带着检测到错误的状态错误状态码结束(例如:End-to-end Guard Check Error, End-to-end Application Tag Check Error, or End-to-end Reference Tag Check Error)。

如果namespace带保护信息格式化,并且命令中PRACT位为1,那么:

1. 如果namespace格式化时,元数据大小【Metadata Size】等于8(参考Figure 246),那么逻辑块数据从主机缓冲区到controller传送。当逻辑块数据透传到controller,controller生成和追加保护信息到逻辑块数据尾部,逻辑块数据和保护信息被写入到NVM(元数据不驻留在主机缓冲区内)。

【下图Figure 246 摘自Identity Namespace章节 5.15.2.1】

2. 如果namespace格式化时,元数据大小【Metadata Size】大于8,那么逻辑块数据和元数据从主机缓冲区到controller被传送。当元数据透传到controller,controller覆盖写这个保护信息,保护信息属于元数据的一部分。逻辑块数据和元数据都被写入到NVM(在NVM中和主机缓冲区中,元数据域保持同样的大小)。在元数据内部保护信息的位置是namespace格式化时配置的(请参考Figure 245的DPS域)。

【下图Figure 245 摘自Identity Namespace章节 5.15.2.1】

 

 

8.3.1.2 Protection Infomation和Read Commands

Figure 453 提供一些保护信息处理例子,它作为一个读命令处理的附带功能出现的。

如果namespace格式化时设置了带保护信息,PRACT的bit位被清0,那么逻辑块数据和元数据被controller从NVM中读出并传递到主机缓冲区,元数据包含保护信息和其他可能的主机元数据(元数据域在NVM中和在主机缓冲区中保持相同的大小)。当逻辑块数据和元数据透传到controller时,元数据内的保护信息被校验的。如果保护信息被校验发现错误,命令结束,返回错误状态码(End-toend Guard Check Error, End-to-end Application Tag Check Error, or End-to-end Reference Tag Check Error)。

如果namespace格式化时,设置带保护信息,PRACT的bit为被设置为1,那么:

a)如果namespace格式化时设置的元数据大小(Metadata Size)等于8(参见Figure246),逻辑块数据和元数据由controller从NVM中读取。当逻辑块和元数据透传到controller时,保护信息被校验,如果保护信息被检测到错误,命令结束,返回探测到的错误码状态(End-toend Guard Check Error, End-to-end Application Tag Check Error, or End-to-end Reference Tag Check Error)。处理完保护信息之后,controller只向主机发送逻辑块数据。

b)如果namespace格式化时,设置Metadata Size大于8,这种情况controller从NVM中读逻辑块数据和元数据,元数据包括保护信息和附件的主机格式的元数据。当逻辑块和元数据透传到controller时,嵌入在元数据中的保护信息被校验,如果保护信息被检测到错误,命令结束,返回探测到的错误码状态(End-toend Guard Check Error, End-to-end Application Tag Check Error, or End-to-end Reference Tag Check Error)。处理完保护信息之后,controller把逻辑块数据和元数据交给主机,嵌入在元数据中的保护信息不做任何变化。(元数据在NVM中和主机缓冲区中大小保持一样)

8.3.1.3 Protection Infomation for Fused Operations

组成的融合操作命令在保护处理方面与单个命令保护处理过程是相同的。

8.3.1.4 Protection Information和Compare命令

图Figure 454 展示保护信息处理导致Compare命令可能产生的额外处理。Compare命令处理同时涉及Write和Read命令,作为Compare命令的一部分,从主机向controller传递的数据和保护信息,保护信息由controller执行校验,与controller执行Write命令保护信息检查并行。Compare命令的另一部分,从NVM媒介中向controller传送数据和保护信息,controller执行保护信息校验与Read命令保护信息检查并行。

 8.3.1.5 Control of Protection Infomation Checking - PRCHK

保护信息的校验包括controller如下执行的一系列操作。如果命令中Protection Infomation Check(PRCHK)域的第二位bit2设置为1,controller将保护信息Guard域与逻辑块数据计算的CRC-16进行比较。如果PRCHK的第一位bit 1被设置为1,controller将保护信息Application Tag域的未被屏蔽位与命令中Logical Block Application Tag(LBAT)域进行比较。如果命令中Logical Block Application Tag Mask(LBATM)域某bit位被设置为0,相应的信息保护Application Tag域的那个bit位屏蔽掉。

对于Type 1保护,如果PRCHK域的bit 0被设置为1,controller将保护信息Reference Tag域与计算的reference tag进行比较。为命令的第一个LBA计算的reference tag值,包含在命令的Initial Logical Block Reference Tag(ILBRT)或Expected Initial Logical Block Reference Tag(EILBRT)域中。如果namespace被格式化为Type 1或Type 2保护,计算出的引用标记对每个后来的逻辑块是递增的。如果namespace被格式化成Type 3保护,对于每个后续逻辑块的引用标记都与初始引用标记保持相同。不像SCSI Protection Infomation Type 1 保护那样暗中使用LBA的最小有效四字节,NVMe使用Type 1保护时,controller总是使用ILBRT或EILBRT域,并要求主机软件来初始化ILBRT或ELBRT域到LBA的最小有效四字节。Type 1保护,controller应该校验ILBRT域或EILBRT域是否正确;如果值与LBA最小有效四字节不匹配,controller结束这个命令,返回非法保护信息的状态。

对于Type 2保护,如果PRCHK域的第0位被设置为1,controller将每个逻辑块的保护信息引用标记域与计算的引用标记进行对比。计算的引用标记对每个后续的逻辑块都递增。为第一个命令的LBA计算的引用标记值,是命令中ILBRT或EILBRT域内的值。主机软件可以设置ILBRT和EILBRT域为任意值。

对于Type 3保护,如果PRCHK域的第0位被设置为1,这个命令应该被终止,返回非法保护信息状态,也可以在命令中Invalid Field状态终止命令。当使用Type 3保护时,因为计算的引用标记保持不变,所以controller可以忽略ILBRT和EILBRT域。

保护校验可以不管命令中的PRCHK域的状态,作为保护信息Application Tag和Reference Tag域值的一个额外处理,关闭它。如果namespace格式化为Type 1或Type 2保护,当保护信息Application Tag的值是0xFFFF时,不论PRCHK域的状态如何,所有保护信息校验被关闭。如果namespace格式化为Type 3保护,当保护信息Application Tag的值是0xFFFF和保护信息Reference Tag值是0xFFFFFFFF时,不论PRCHK域的状态如何,所有保护信息校验被关闭。

插入的保护信息包括Guard域中计算的CRC-16,Application Tag域中LBAT字段值,以及Reference Tag域中计算的引用标记。

 

posted @ 2020-02-27 17:11  JamesLi_1119401255  阅读(2013)  评论(0编辑  收藏  举报