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域中計算的引用標記。