NVMe · 規格與原理

NVMe Namespace Write Protection:狀態、控制與命令行為

00.01.一份已寫好的資料要繼續提供讀取,又要避免後續命令改動它,可以對所在的 namespace 設定寫入保護。Namespace Write Protection 不只是一個開關:它有可解除、直到斷電、永久等不同狀態,並把裝置支援、進入許可與實際保護分開。本篇把這些關係接到 FID 84h,最後說明保護如何改變命令處理。

Namespace Write Protection
namespace寫入保護;控制一份namespace能否接受受限制的修改操作。
namespace
namespace,主機透過 controller 存取的一份已格式化非揮發性容量。
FID
Feature Identifier;指定要讀取或設定哪一項 Feature 的編號。

這篇的主軸

01

保護的對象與邊界

01-01設定跟著 namespace,所有附接它的控制器都要遵守。先分清資料對象與傳送命令的控制器,再看會影響多個 namespace 的操作。

02

用事件追蹤狀態

02-01四種狀態各有允許的進入與離開路徑。Set Features、控制器重設與 power cycle 造成的結果不同,圖上的箭頭必須帶著事件讀。

power cycle
電源循環,即斷電後重新上電;不等同於所有形式的控制器重設。
03

從能力走到成功設定

03-01NWPC 回答能不能支援,WPC 決定特定進入要求是否獲准,WPS 回報目前狀態。設定成功還包含將既有寫入快取提交到媒體。

NWPC
Namespace Write Protection Capabilities,控制器支援哪些保護狀態的位元欄位。
WPC
Write Protection Control,決定是否接受進入特定保護狀態之要求的控制欄位。
WPS
Write Protection State,namespace目前的寫入保護狀態代碼。
04

保護後如何使用與觀察

04-01Read、Flush、管理命令各有處理規則;跨 namespace 的操作也受影響。用目前 WPS、完成狀態與健康警告回答各自的問題。

00.02.讀者已學過 OS 與 Computer Organization,並了解 SSD 基本概念。本文使用 namespace 7/8 與控制器 A/B 作為說明性範例;數值不代表裝置一定具備這些配置。

00.03.先掌握四種狀態,再讀支援與控制位,接著完成一個設定案例;最後把狀態套回實際命令。欄位說明按相關概念分組,可從正文直接連到對應圖表。

把主軸連起來

00.04.全文以 namespace 7 的資料集為例:先決定需要哪種保護與解除方式,再確認裝置能否接受該轉換,等待設定成功,最後解釋哪些操作還能執行。每個欄位都有一個具體要回答的問題。

00.05.最容易混淆的三組關係是:支援能力與進入許可、不可保存與跨斷電保留、namespace 保護狀態與全體媒體健康警告。後面的對比會分別處理它們。

01 先看保護誰,再看四種狀態

01.01.Namespace Write Protection 讓主機控制單一 namespace 的寫入保護狀態。支援這項能力時,No Write Protect 與 Write Protect 必備;Until Power Cycle 與 Permanent 兩種狀態選用。namespace 建立時從 No Write Protect 開始;同一 namespace 的狀態須由所有附接它的控制器共同遵守。

來源:Base 2.4 §8.1.18

來源:NVME-BASE-2.4, Rev. 2.4, §8.1.18, 文件頁 664-666, PDF 頁 690-692

01.02.FID 84h 的作用範圍是 namespace,不使用額外屬性資料 buffer。WPS 的 0、1、2、3 是互斥的狀態代碼,不是可自由組合的位元遮罩。

來源:Base 2.4 §5.2.30.1.38

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.1.38, 文件頁 512-513, PDF 頁 538-539

從保存一份資料的情境開始

01.03.假設 namespace 7 放著一份已完成驗證的資料集,接下來只希望讀取,不希望後續命令改寫它。這時主機可以要求控制器把 namespace 7 切到 Write Protect。保護的是這份儲存空間,不是某個程式的檔案權限,也不是把整顆裝置拔掉;查詢狀態、讀取資料等操作仍各有允許規則。本文的 7 是說明用的有效識別值。

四個代碼先按用途理解

01.04.WPS=0 表示本機制未設寫入保護;1 表示已保護,但可用合法的 Set Features 要求解除;2 表示維持保護直到 power cycle;3 表示永久保護。這些代碼不代表程度從弱到強的連續量。尤其 3 不是把 1 與 2 兩種功能疊加,而是另外定義的一個狀態。

設定經由控制器送出,保護跟著 namespaceA、B 的箭頭都指向同一份namespace7;它們必須遵守相同保護。下方namespace8是另一個設定對象。此圖說明附接關係,不表示命令執行順序。來源:Base §8.1.18。Controller A送出 Set FID84hController B同樣遵守 WPSNamespace 7 · WPS=1所有附接的控制器共同遵守Namespace 8 · WPS=0獨立的 namespace 設定
A、B 的箭頭都指向同一份namespace7;它們必須遵守相同保護。下方namespace8是另一個設定對象。此圖說明附接關係,不表示命令執行順序。來源:Base §8.1.18。

支援整個功能,不等於支援每一種狀態

01.05.裝置可以只提供 0 與 1,仍符合這項選用功能的最低要求。想用 2 或 3,必須先確認控制器宣告支援。原表的 M 是「有實作 Namespace Write Protection 時必備」,不能讀成每一台 NVMe 裝置都一定有這項功能。

NVMe
Non-Volatile Memory Express,主機與非揮發性記憶體子系統之間的介面規範家族。

從另一個控制器存取也受到限制

01.06.若控制器 A、B 都附接 namespace 7,由 A 設好的保護不能透過 B 繞過。規格要求附接該 namespace 的任何控制器都遵守它的保護狀態。反過來,namespace 8 是另一個設定對象;保護 7 不等於自動把 8 的 WPS 也改成 1。之後會再討論影響多個 namespace 的命令。

閱讀相關規格圖表 → 先看保護誰,再看四種狀態

02 沿著狀態圖理解解除與重設

02.01.Set Features 可在 0 與 1 之間切換,也可從 0 或 1 進入受支援且獲准的 2 或 3。處於 2 或 3 時,用 Set Features 要求改變狀態會得到 Feature Not Changeable。一般狀態機中,2 經 power cycle 回到 0;沒有 power cycle 的 Controller Level Reset 不解除它。

Controller Level Reset
控制器層級重設;狀態2是否解除仍要辨認有沒有發生power cycle。
來源:Base 2.4 §8.1.18; 5.2.30.1.38

來源:NVME-BASE-2.4, Rev. 2.4, §8.1.18; 5.2.30.1.38, 文件頁 512-513,664-665, PDF 頁 538-539,690-691

02.02.除了狀態 2,四種狀態都跨 power cycle 與 Controller Level Reset 保留。FID 84h 不可保存且沒有 default 值,但這不會取消各狀態本身的持續性。Revert to Subsystem Manufacturing Settings Personality 生效時,非永久狀態回到 0,永久狀態維持。

來源:Base 2.4 §5.2.30.1.38; 8.1.18

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.1.38; 8.1.18, 文件頁 512-513,664, PDF 頁 538-539,690

先追蹤可逆的那條路

02.03.建立 namespace 後是 0。成功 Set WPS=1 會進入一般寫入保護,之後成功 Set WPS=0 可以解除。這兩個方向都是命令造成的轉換。不要看到狀態名稱有「Write Protect」就以為一律不可解除;是否能解除,要看完整的狀態名稱與目前代碼。

Until Power Cycle 不是 Until Reset

02.04.從 0 或 1 可進入 2,但沒有用 Set Features 從 2 回到 0、1 或前進到 3 的箭頭。要求改變會被拒絕。2 回到 0 的特殊箭頭是 power cycle;若只是控制器層級重設而沒有 power cycle,仍然是 2。日常說的「重開」太含糊,必須辨認實際發生的是哪種事件。

四種狀態:先看起點,再看事件普通箭頭為Set Features;通往2、3的箭頭另須能力、WPC及相關配置條件成立。圖中2回到0的箭頭由power cycle觸發,3沒有解除箭頭。為了讓線條清楚,兩條垂直分支分別標明可從0或1出發。來源:Base Figures735/736、§5.2.30.1.38。0 · No Write Protect建立時的狀態1 · Write Protect可由 Set 解除從 0 或 1;要求 WPS2從 0 或 1;要求 WPS32 · Until Power CycleSet 不能改變此狀態3 · Permanent沒有解除路徑Power cycle → WPS0power cycle 後仍為 3
普通箭頭為Set Features;通往2、3的箭頭另須能力、WPC及相關配置條件成立。圖中2回到0的箭頭由power cycle觸發,3沒有解除箭頭。為了讓線條清楚,兩條垂直分支分別標明可從0或1出發。來源:Base Figures735/736、§5.2.30.1.38。

Permanent 的圖上沒有解除箭頭

02.05.從 0 或 1 進入 3 後,Set Features 不能再改變此狀態,斷電與控制器重設也不解除它。這是理解狀態機的重要界線:不能因為 3 的數字比 2 大,就假設可以先進入 2 再往上調到 3。圖上的箭頭才定義了允許路徑,支援與控制條件還要同時成立。

把不可保存和跨重設保留分開

02.06.Set Features 的 Save 是一種儲存 feature 屬性值的通用機制;本功能不提供這種保存選項。WPS 的持續性則直接由本節規定。因此 WPS=1 即使是用 SV=0 設定,斷電後仍是 1;WPS=2 同樣用 SV=0,斷電後卻回到 0。不能用 SV 的值替代狀態規則。

SV
Save,Set Features中要求保存屬性值的位元。

出廠設定復原是另外一種事件

02.07.指定的 Revert to Subsystem Manufacturing Settings Personality 真正生效後,1、2 等非永久狀態回到 0;3 保留。它不是一般 Controller Level Reset 的別名,也不是本篇 state machine 裡的 Set WPS 解除命令。這裡只說它對 WPS 的結果,不把這項管理操作當作一般解除流程。

閱讀相關規格圖表 → 沿著狀態圖理解解除與重設

03 能力、進入許可與目前狀態是三件事

03.01.NWPC 宣告控制器支援哪些狀態;RPMB 的 WPC 控制是否允許命令進入狀態 2 或 3;FID 84h 的 WPS 才是 namespace 目前的狀態。WPUPCC=0 或 PWPC=0 會阻止對應的進入要求。MDS=1 的多 domain subsystem 禁止使用狀態 2,即使相關能力與控制位已設為 1。

WPUPCC
Write Protect Until Power Cycle Control,WPC內允許進入狀態2的控制位。
domain
subsystem內用來界定通訊與故障影響的範圍;本篇用它判斷是否允許直到斷電的保護。
PWPC
Permanent Write Protect Control,WPC內允許進入永久保護的控制位。
RPMB
Replay Protected Memory Block,使用認證與防重播機制存取的記憶區;本篇只取其WPC控制欄位。
MDS
Multi-Domain Subsystem,Identify Controller中表示支援多domain的位元。
來源:Base 2.4 §8.1.18; 5.2.30.1.38

來源:NVME-BASE-2.4, Rev. 2.4, §8.1.18; 5.2.30.1.38, 文件頁 512-513,664-665, PDF 頁 538-539,690-691

03.02.Identify Controller 的 NWPC 位於 byte 531,bit 0 支援 0/1,bit 1 支援 2,bit 2 支援 3。CTRATT bit 10 的 MDS 表示多 domain;ONCS bit 4 的 SSFS 控制非零 SEL/SV 的支援。

SSFS
Save and Select Feature Support,表示是否支援非零SV與SEL選項。
SEL
Select,Get Features中選擇目前值、預設值、已保存值或能力的欄位。
來源:Base 2.4 §5.2.14.2.1

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.14.2.1, 文件頁 346,371-372,375, PDF 頁 372,397-398,401

03.03.RPMB target 0 的 Device Configuration Block byte 2 是 WPC:bit 0 WPUPCC、bit 1 PWPC。支援 Namespace Write Protection 時,這兩個控制位在 power cycle 或 Controller Level Reset 後清為 0;它們清零不代表既有 WPS 也清零。

Device Configuration Block
RPMB target0的裝置設定資料結構,WPC位於其中byte2。
來源:Base 2.4 §8.1.24

來源:NVME-BASE-2.4, Rev. 2.4, §8.1.24, 文件頁 691-692, PDF 頁 717-718

先問裝置會不會,再問目前允不允許

03.04.NWPC=07h 表示 0~3 都受支援,並不是目前 WPS=7。即使硬體具備永久保護能力,PWPC=0 仍會拒絕要求進入 3 的 Set Features。這就像一項操作確實存在,但另有控制位決定現在是否接受;兩者都不能用目前 namespace 是不是唯讀來替代。

WPC 位於另一份經認證存取的設定結構

03.05.WPC 不在 FID 84h 的 CDW11,也不屬於 namespace 的 WPS。它在 RPMB target 0 的 Device Configuration Block 內;RPMB 透過認證與防重播機制存取,不能把一般 namespace 的 Write 命令當作修改 WPC 的方法。本篇只需要理解這個控制欄位與 FID 84h 的關係,不需要先學完整訊息交換才能理解狀態機。

CDW
CDW(Command Dword);命令中的 32-bit 欄位單位,例如 CDW10 的 10 是欄位 index,不是 byte offset。
相同的數字,放在不同欄位意思不同
觀察到的值它回答的問題不能推出的結論
NWPC=03h支援0/1及2,不支援3目前已永久保護
WPC=03h允許處理進入2與3的要求所有namespace已保護
WPS=3這個namespace已永久保護這是一份支援bitmap
MDS=1多domain;禁止進入2禁止所有寫入保護
每列獨立示範欄位意義,不是同一台裝置的完整配置。Source:Base Figures338/756/541。

控制位重設後,已保護的資料仍然受到保護

03.06.假設 PWPC 曾為 1,namespace 7 已成功進入永久保護。控制器重設後 PWPC 清為 0,意思是後續嘗試讓其他 namespace 進入永久保護時,必須重新滿足控制條件;namespace 7 本來的永久保護仍在。WPS=2 經沒有斷電的控制器重設也保留,雖然 WPUPCC 此時已清零。

多 domain 限制要看整個 subsystem

03.07.狀態 2 的解除需要 namespace 與它所附接的所有控制器同時經歷 power cycle。多 domain 配置不能以單一局部電源事件保證這件事,因此規格禁止在 MDS=1 時使用狀態 2;要求進入時回 Feature Not Changeable。這個條件針對狀態 2,不應自行擴大成多 domain 配置禁止所有寫入保護。

閱讀相關規格圖表 → 能力、進入許可與目前狀態是三件事

04 把查詢、設定與成功完成接起來

04.01.以有效且 active 的 NSID 選 namespace;Get FID 84h、SEL=0 讀目前 WPS,Set 在 CDW11 bits 2:0 放新 WPS。設定不可使用 SV=1;SEL=1 沒有 default 可讀,回 Invalid Field in Command。成功進入寫入保護時,控制器必須把該 namespace 的所有揮發性寫入快取資料及 metadata 寫入非揮發媒體。

metadata
隨 logical block 儲存的附加資料,可包含資料保護資訊,也可有其他用途。
active
已附接於處理命令之控制器的namespace狀態。
NSID
Namespace Identifier,controller 用來指向 namespace 的數值 handle;identifier 不等於 namespace 物件本身。
來源:Base 2.4 §5.2.30.1.38

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.1.38, 文件頁 512-513, PDF 頁 538-539

04.02.Get 的 SEL=3 回 CHANG、NSSPEC、SVBL 能力格式;CHANG=1 只表示功能有可改變的值,不保證目前的永久狀態可解除。FID 84h 不可保存,SEL=2 的 saved 請求依通用規則轉成 default,仍遇到本功能沒有 default 的限制。

NSSPEC
NS Specific,能力回覆中表示namespace作用範圍的位元。
CHANG
Changeable,能力回覆中表示此Feature有可變更值的位元。
SVBL
Saveable,能力回覆中表示是否可保存屬性值的位元。
來源:Base 2.4 §5.2.12; 5.2.12.2; 5.2.30.1.38

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.12; 5.2.12.2; 5.2.30.1.38, 文件頁 209-212,512, PDF 頁 235-238,538

04.03.指定的 namespace 範圍 的 FFFFFFFFh:Set 在 MDS=0 時通常選處理命令之控制器附接的所有 namespace;MDS=1 時回 Invalid Field in Command。Get 沒有本功能特例可套用,回 Invalid Namespace or Format。共享設定需要主機間協調。

來源:Base 2.4 §4.4

來源:NVME-BASE-2.4, Rev. 2.4, §4.4, 文件頁 168-169, PDF 頁 194-195

04.04.成功 Set Features 完成後才提交的命令必須使用新設定;更早已提交的命令可能使用或不使用新設定。要劃清前後兩批,主機宜先讓處理中的命令完成,再修改設定。成功完成不能早於 Feature 屬性設定完成。

來源:Base 2.4 §5.2.30.1; 5.2.30.4

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.1; 5.2.30.4, 文件頁 459,519, PDF 頁 485,545

先讀目前值,才能選合法路徑

04.05.範例選已附接的 namespace 7,送 Get Features,FID=84h、SEL=0,CDW10=00000084h。成功完成後,CQE DW0 的低 3 bits 才是 WPS。若讀到 0,可以計畫進入 1;若讀到 2,就不能以相同流程要求改成 1。Get 不會把 namespace 改成查到的值,它只回報狀態。

CQE
Completion Queue Entry,CQ 中的一筆完成結果資料結構。

同一個 DW0,要先看當初問的是什麼

04.06.SSFS 支援非零 SEL 時,SEL=3 的 CDW10 是 00000384h,回覆改成能力格式。假設 DW0=6,表示 CHANG=1、NSSPEC=1、SVBL=0,不是 WPS=6。尤其即使已永久保護,CHANG 仍可表示這個 Feature 曾有可變更的值;它不是解除永久保護的許可。SEL=2 也不能拿來尋找「上次保護前的值」:不可保存時會轉問 default,而本功能沒有 default。

成功切入保護,包含先把既有快取提交到媒體範例採WPS0 → 1、NSID7。主機宜先等舊命令完成;控制器在轉換時提交該namespace的快取資料與metadata。完成後才提交的命令必須用新設定;較早在途的命令不能一概推定。來源:Base §§5.2.30.1、5.2.30.1.38、5.2.30.4。主機:先等待前一批命令完成Set · NSID7 · FID84h · SV0CDW11 = 00000001h控制器:將此 namespace 的快取提交到媒體包含 data 與 metadata完成設定後,回覆成功 CQEGet · SEL0 → CQE DW0 = 1確認目前保護狀態
範例採WPS0 → 1、NSID7。主機宜先等舊命令完成;控制器在轉換時提交該namespace的快取資料與metadata。完成後才提交的命令必須用新設定;較早在途的命令不能一概推定。來源:Base §§5.2.30.1、5.2.30.1.38、5.2.30.4。

送出要求,不把參數當結果

04.07.在 WPS=0 的範例中,Set 的 NSID=7、CDW10=00000084h、CDW11=00000001h,表示要求一般 Write Protect;WPS 不放在資料 buffer 裡。SV=0 是正確用法。若錯用 SV=1,會遇到 Feature Identifier Not Saveable,不能因為送過命令就宣稱已經保護成功。

成功完成之前,控制器還要處理快取

04.08.進入保護不只是把一個狀態 bit 改掉。該 namespace 在揮發性寫入快取中的資料和 metadata 必須在轉換時寫到非揮發媒體。這樣成功切入保護後,受影響的既有快取內容不會留待後續寫回。規格沒有給這個步驟固定毫秒數;資料量與裝置行為會影響完成時間。

用清楚的命令邊界理解前後行為

04.09.教學流程先等待先前的寫入完成,再送 Set,等待成功 CQE,最後讀回 WPS。這符合通用的設定切換建議,也避免把已在處理中的命令硬套成一定使用新值。若多個主機共享同一 namespace,還要協調對這份設定的存取;本規格不定義主機之間的協調協定。

不要把特殊 NSID 當成方便的查詢捷徑

04.10.本文使用單一 目前可存取的 NSID,是為了明確選到目標。FFFFFFFFh 的 Set 和 Get 行為不對稱;Set 在單 domain 可涵蓋該控制器附接的全部 namespace,但每個目標仍受自己的狀態限制,不能據此推論多目標更新的原子性。Get 不用這個值回一張全體 WPS 清單。active 表示已附接於本控制器;inactive 與 invalid 的錯誤也不同,欄位教學會把兩者分開。

inactive
已配置但未附接於該控制器的namespace狀態,與無效識別值不同。
invalid
無效;此處指無效namespace識別值,而非僅未附接。
閱讀相關規格圖表 → 把查詢、設定與成功完成接起來

05 保護後,哪些命令仍能做什麼

05.01.Figure 737 列出對受保護 NSID 正常處理的命令,但註腳仍限制會修改非揮發媒體的動作。Flush 成功且不產生作用;Directive Receive 若要求配置 Streams 資源則回 Namespace is Write Protected。未列出的命令只要符合本節列出的受保護目標或跨 namespace 修改條件,就會被拒絕。

來源:Base 2.4 §8.1.18.2

來源:NVME-BASE-2.4, Rev. 2.4, §8.1.18.2, 文件頁 665-666, PDF 頁 691-692

正常處理不等於保證成功

05.02.Read、Compare、Verify 仍可以處理,是指寫入保護本身不阻擋它們;若讀到媒體錯誤,仍可能因自己的命令規則失敗。Get Features、Identify 等查詢也是如此。這張表不是「只要在表內就永遠成功」的保證表,而是說明寫入保護如何與命令處理共存。

有些列必須連註腳一起讀

05.03.例如 Dataset Management 列在允許表中,但其指定動作若試圖修改受保護 namespace 的非揮發媒體,控制器必須使命令失敗。Directive Send、Security Send/Receive、Set Features 與兩類 Vendor Specific 命令也有這個註腳。因此僅用命令名稱判斷不夠,必須再看該次請求的具體動作。

命令名稱只是起點,實際動作決定判斷
命令或情境是否被寫入保護阻擋原因
Read/Compare/Verify正常處理;仍可能有其他錯誤保護不封鎖這些操作
Dataset Management修改受保護媒體必須失敗表內命令仍受註腳1約束
受保護NSID的Flush成功且無作用進入保護時已提交快取
Format指向8但也修改受保護的7Namespace is Write Protected實際影響包含受保護namespace
Sanitize會修改受保護namespaceNamespace is Write Protected沒有指定NSID也須遵守保護
每列示範不同判斷,不構成執行順序。完整允許清單與三項註腳在圖表閱讀區逐組說明。來源:Base Figure737及其後條文。

Flush 的特例來自前面的轉換保證

05.04.受保護 NSID 的 Flush 必須成功且不產生作用。原因是進入保護時,該 namespace 的所有揮發性快取資料與 metadata 已被寫入非揮發媒體。這裡沒有授權 Flush 在保護後偷偷修改資料,也沒有說所有情況下的 Flush 都不需要做事;這是針對已受保護 namespace 的規則。

Directive Receive 要辨認是不是配置資源

05.05.這個命令名稱看起來像只接收資料,但其配置 Streams 資源的操作另有規則:對受保護 namespace 執行時,必須以 Namespace is Write Protected 中止。這個例子提醒讀者:資料傳送方向不能單獨代表操作是否改變狀態。

真正影響的 namespace 比命令上寫哪個 NSID 更重要

05.06.未列在 Figure 737 的命令,若直接指定受保護 namespace,會受到拒絕規則約束。另一種情況是命令指定未受保護的 namespace 8,實際操作卻會修改受保護的 7;規格以 Format NVM 為例,仍須拒絕。再例如 Sanitize 沒有指定某個 NSID,只要執行會修改受保護 namespace,仍須拒絕。不能靠改填目標或省略 NSID 繞過保護。

NVM
Non-Volatile Memory,斷電後仍能保存資料的記憶體。
閱讀相關規格圖表 → 保護後,哪些命令仍能做什麼

06 用正確的狀態與錯誤解釋結果

06.01.主機應以 Get FID 84h 查 namespace 寫入保護狀態。控制器不得只因本狀態機造成的唯讀條件,就把 SMART Critical Warning 的 All Media Read-Only 設為 1;AMRO=0 也不能證明 namespace 沒有設保護。外部寫入保護系統與本機制組合的結果不在此規格定義內。

AMRO
All Media Read-Only,SMART健康資訊中表示全體媒體唯讀的警告位。
來源:Base 2.4 §8.1.18.1

來源:NVME-BASE-2.4, Rev. 2.4, §8.1.18.1, 文件頁 665, PDF 頁 691

06.02.Namespace is Write Protected 表示命令被既有保護禁止;Feature Not Changeable 表示要求改變的值當下不可改;Feature Identifier Not Saveable 表示不支援保存要求。它們分別出現在命令執行、狀態轉換與保存設定的問題上。

來源:Base 2.4 §4.2.1; 5.2.30.4

來源:NVME-BASE-2.4, Rev. 2.4, §4.2.1; 5.2.30.4, 文件頁 149,519, PDF 頁 175,545

查詢設定與查看健康警告,目的不同

06.03.WPS=1 是主機要求的 namespace 保護狀態;SMART 的 AMRO 是全體媒體唯讀警告。若所有 namespace 都因 FID 84h 設成保護,也不能僅因此把 AMRO 設為 1。想知道 namespace 7 的設定,直接查它的 WPS,不要從整體健康 bit 猜測。

WPS=0 只排除這個機制的保護

06.04.解除本功能不代表下一筆 Write 在任何條件下都會成功。其他錯誤、媒體狀況或外部保護仍可能影響操作;本節沒有把它們都收編成 WPS 的狀態。若外部寫入保護機制也存在,本規格不定義兩者組合的所有結果,不能自行編造優先順序。

先問正在觀察什麼,再選資料來源
想回答的問題查看哪裡代表性判讀
namespace7目前是哪種保護?Get FID84h、SEL0的WPS1是一般Write Protect
裝置是否支援永久保護?Identify的NWPC bit21是支援,不是已進入
為何要求改變狀態失敗?完成狀態+原狀態/控制條件WPS2要求0:Feature Not Changeable
是否回報全體媒體唯讀警告?SMART的AMRO不能只因WPS變化而設1
這些資料可同時存在;它們分別描述設定、能力、一次命令的結果與健康狀況。來源:Base §8.1.18與Figures338/541/554/213。

從主機原本想做的動作解讀失敗

06.05.如果主機本來想寫受保護的 namespace,Namespace is Write Protected 說的是資料命令受到限制。若主機想把 WPS=2 改成 0,Feature Not Changeable 說的是此狀態不允許 Set 解除。若主機錯把 SV=1 加到 FID 84h,Feature Identifier Not Saveable 說的是保存要求不成立;這三種情境不能都寫成模糊的「功能不支援」。

完成一個可以向別人說清楚的判斷

06.06.最後應能把 namespace、能力、控制位、目前狀態、所要求的動作與完成結果串成一句有因果的描述。例如:namespace 7 已是 2,所以 Set WPS=0 被拒絕;控制器重設未造成 power cycle,因此目前仍是 2。這比只記一個錯誤名稱更能解釋裝置行為。

閱讀相關規格圖表 → 用正確的狀態與錯誤解釋結果

07 讀懂本篇的規格圖表

07.01.以下依概念整理規格中的圖表。每組先說明讀取順序與要判斷的問題,接著列出各圖的欄位或行為說明。可以由正文的連結跳到對應組別,也可以用這一節檢查自己能否把欄位連回完整操作。

圖表組 01 · 先看保護誰,再看四種狀態 · 1 張圖表

07.02.先用 Figure 735 比較狀態與支援要求;WPS 的實際編碼在 Figure 541。

回到本節的解釋與範例

把狀態、支援要求與持續性分開讀

07.03.Figure 735 不是能力 bitmap,也不是命令格式;每一列是一種狀態。以下代碼用 Figure 541 補上,讓名稱、數值與事件結果接得起來。

欄位或圖上標示讀值與條件帶入例子後的結論
M/O 與註腳M:有實作本功能時必備;O:有實作本功能時仍可選擇是否支援。NWPC bit0=1、bits2:1=0 的裝置可以只有狀態 0、1。
No Write Protect/Write Protect0 為未設保護,1 為一般保護;兩者都跨 power cycle 與 Controller Level Reset 保留。斷電不會自動把 1 解除成 0。
Write Protect Until Power Cycle2 在沒有 power cycle 的 Controller Level Reset 後保留;power cycle 才使其回到 0。僅重設控制器後,仍不能送 Set WPS=0 來解除 2。
Permanent Write Protect3 是永久保護;兩種事件後都保持。power cycle 不提供 3 → 0 的路徑。
Persistent Across 欄的讀法先選目前狀態,再選實際事件;No 表示不保留原狀態,轉到哪裡要結合正文。狀態 2 的 No 不是功能消失,而是狀態轉為 0。
來源:Base 2.4 §8.1.18

來源:NVME-BASE-2.4, Rev. 2.4, §8.1.18, Figure 735, 文件頁 664, PDF 頁 690

Base Figure 735 · Namespace Write Protection State Definitions

一句話重點

Base735-1M/O 表示支援要求;兩個 persistence 欄表示事件發生後是否仍保持原狀態。

來源:Base 2.4 §8.1.18

來源:NVME-BASE-2.4, Rev. 2.4, §8.1.18, Figure 735, 文件頁 664, PDF 頁 690

用例子讀懂

Base735-2WPS=2 這列在 Power Cycles 是 No、Controller Level Resets 是 Yes。配合正文可知:真正 power cycle 後回到 0;沒有 power cycle 的控制器重設仍是 2。不是看見任一 Reset 就讀 No。

圖表組 02 · 沿著狀態圖理解解除與重設 · 2 張圖表

07.04.Figure 736 看箭頭與事件,Figure 735 看事件後是否保留;兩張圖回答不同問題。

回到本節的解釋與範例

把目標、外框與功能參數放到正確位置

07.05.只取 Figure93 的 NSID、CDW 位置,Figure463 的資料指標用途、Figure464 的 SV/FID,以及 Figure466 的 FID84h 列與註腳2、8。

欄位或圖上標示讀值與條件帶入例子後的結論
NSID bytes7:4:active、inactive、invalidactive 已附接本控制器;inactive 已配置但未附接;invalid 是無效識別值。通用格式對 inactive 回 Invalid Field in Command,對 invalid 回 Invalid Namespace or Format,除非另有特例。不存在的 ID 和存在但未附接的 ID 不要寫成同一種「不可用」。
NSID=FFFFFFFFhSet:MDS=0 通常設定本控制器附接的所有 namespace,MDS=1 拒絕。Get:本功能沒有全體查詢特例,回 Invalid Namespace or Format。不從一次 broadcast Set 推論每個目標都可轉換,也不假設更新原子性。
CDW10 bytes43:40SV bit31;FID bits7:0;bits30:8 保留。FID84h 不可保存,使用 SV=0。(0 << 31) | 84h = 00000084h。
CDW11 bytes47:44;DPTR bytes39:24CDW11 帶 WPS;Figure463 定義的 DPTR 不用來放本 Feature 屬性。byte offset44 = 11×4;不是把 WPS 左移44位。
Figure466:84h 列 Scope/Uses Data BufferScope=Namespace;Uses Data Buffer=No。不是只對收到命令的控制器生效。
Figure466:註腳2與8持續性欄只供不可保存 Feature 使用;84h 正是不可保存,但註腳8仍要求使用專屬狀態規則。WPS1保留、WPS2在power cycle清除,不能一起讀成No。
DPTR
Data Pointer,SQE 中指出 command data buffer 的欄位。
來源:Base 2.4 §4.1.1 · Base 2.4 §5.2.30

來源:NVME-BASE-2.4, Rev. 2.4, §4.1.1, Figure 93, 文件頁 140-142, PDF 頁 166-168

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30, Figure 463, 文件頁 456, PDF 頁 482

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30, Figure 464, 文件頁 457, PDF 頁 483

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30, Figure 466, 文件頁 459, PDF 頁 485

Base Figure 466 · Set Features – Feature Identifiers

一句話重點

Base466-1FID84h 的 No 帶註腳8,必須回到此 Feature 的狀態規則判斷持續性。

來源:Base 2.4 §5.2.30

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30, Figure 466, 文件頁 459, PDF 頁 485

用例子讀懂

Base466-2只看 Current Setting Persists 的 No,會錯把 WPS=1 讀成斷電即解除。註腳8 指定由該 Feature 定義,而 Figure735 規定 WPS=1 保留;本列同時指出 namespace 作用範圍、無屬性 buffer。

用起點、方向和觸發事件讀狀態機

07.06.這張圖沒有 bit 欄位,節點與箭頭就是需要解讀的資訊。Figure 736 只畫轉換關係;可用能力、WPC 與 MDS 的附加條件見控制欄位組。

欄位或圖上標示讀值與條件帶入例子後的結論
Initial state → No Write Protect新建 namespace 從 0 開始。這是建立時的起點,不代表每次控制器重設都回到 0。
0 → 1 與 1 → 0成功 Set Features 進入一般保護或解除一般保護。先在 1,要求 0,是有箭頭的操作。
0/1 → 2兩個來源都可以要求進入 Until Power Cycle,另須支援、WPUPCC=1、MDS=0。來源 1 也能進入 2,不必先解除成 0。
0/1 → 3兩個來源都可以要求進入 Permanent,另須支援且 PWPC=1。來源 2 不在這組箭頭內。
2 → 0:Power Cycle這個返回箭頭的事件不是 Set Features。沒有 power cycle 的重設保留 2。
3 沒有離開箭頭;2 沒有 Set 離開箭頭要區分「改變到另一狀態」與同值請求;本節的 Feature Not Changeable 條文針對改變狀態的嘗試。不替原圖補上 3 → 1,也不把條文擴寫成所有同值請求必須失敗。
來源:Base 2.4 §8.1.18

來源:NVME-BASE-2.4, Rev. 2.4, §8.1.18, Figure 736, 文件頁 664, PDF 頁 690

Base Figure 736 · Namespace Write Protection State Machine Model

一句話重點

Base736-1圖上的普通箭頭由 Set Features 觸發,唯一標 Power Cycle 的箭頭是 2 回到 0。

來源:Base 2.4 §8.1.18

來源:NVME-BASE-2.4, Rev. 2.4, §8.1.18, Figure 736, 文件頁 664, PDF 頁 690

用例子讀懂

Base736-2原圖有 1 → 2 與 1 → 3,但沒有 2 → 3。即使永久保護受支援且 PWPC=1,已在 2 時要求改成 3 仍會被拒絕;必須尊重目前狀態,而不只檢查目的地能力。

圖表組 03 · 能力、進入許可與目前狀態是三件事 · 2 張圖表

07.07.Figure 338 的支援位、Figure 756 的控制位與 Figure 541 的狀態碼要分開解碼。

回到本節的解釋與範例

先辨認位元組位置,再辨認每個 bit 的問題

07.08.Figure 338 很長;本篇只取 NWPC、CTRATT.MDS 與 ONCS.SSFS。其他未在此列出的能力 bit 有各自用途,不是全都保留。位置從 Identify Controller 結構起點起算。

欄位或圖上標示讀值與條件帶入例子後的結論
NWPC byte 531:bit0 NWPWPS1 支援 No Write Protect/Write Protect;0 不支援本功能,bits1、2 也須為 0。NWPC=01h 已表示支援本功能的基本兩種狀態。
NWPC bit1 WPUPCS1 支援 Until Power Cycle,且必須支援 WPC 控制欄位。(NWPC >> 1) & 1 = 0 時,不選 WPS=2。
NWPC bit2 PWPS;bits7:3 保留1 支援 Permanent,且必須支援 WPC。bit2 本身不是 PWPC 進入許可。05h 的 bit2=1;仍要另外確認 WPC.PWPC。
CTRATT bytes 99:96:bit10 MDS1 支援多 domain;0 表示單 domain 且不支援多 domain 回報。使用 (CTRATT >> 10) & 1;MDS=1 阻止進入 2。
ONCS bytes 521:520:bit4 SSFS1 支援非零 SEL/SV;0 時不使用非零選項。特定 Feature 的限制仍優先適用。SSFS=1 不會讓不可保存的 FID84h 變成可以 SV=1。
來源:Base 2.4 §5.2.14.2.1

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.14.2.1, Figure 338, 文件頁 346,371-372,375, PDF 頁 372,397-398,401

Base Figure 338 · Identify – Identify Controller Data Structure, I/O Command Set Independent

一句話重點

Base338-1NWPC 說明裝置能力,MDS 限制狀態 2,SSFS 決定是否能使用非零查詢選項。

來源:Base 2.4 §5.2.14.2.1

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.14.2.1, Figure 338, 文件頁 346,371-372,375, PDF 頁 372,397-398,401

用例子讀懂

Base338-2NWPC=05h 表示支援 0/1 與 3,不支援 2;不是目前 WPS=5。若 NWPC=07h 但 MDS=1,也仍不能使用狀態 2。這些結論要讀各自的 bit,不能比較整個 CTRATT 是否只等於 400h。

WPC 的位置、兩個許可與重設後結果

07.09.本篇引用 Figure 756 的 byte2。它是 RPMB target0 的 512-byte Device Configuration Block 的一部分;相鄰 bytes0、1 屬 Boot Partition 保護,不能拿來解讀 namespace 的 WPS。

欄位或圖上標示讀值與條件帶入例子後的結論
byte2:WPC;Type=RW可讀寫的控制欄位,透過 RPMB 的存取機制操作;不在 FID84h 的命令參數內。WPC=01h 不等於某個 namespace 已是 WPS=1。
WPC bit0:WPUPCC0 拒絕要求進入 2 的 Set;1 允許處理該要求,但仍須符合能力與狀態條件。NWPC 支援且 WPC=01h,也不能忽略 MDS=1 的禁止。
WPC bit1:PWPC0 拒絕要求進入 3 的 Set;1 允許處理,並不直接執行狀態轉換。把 PWPC 設為 1 本身不會把所有 namespace 變永久保護。
power cycle/Controller Level Reset支援本功能時,WPUPCC、PWPC 均清為 0。重設後要進入 3 的新請求與既有 WPS=3 的保留,是不同問題。
保留區與不支援時WPC bits7:2 保留;不支援 Namespace Write Protection 時 WPC 必須為 0。結構 bytes511:3 保留。例子只使用 00h~03h,不把保留 bit 當成更多保護狀態。
來源:Base 2.4 §8.1.24

來源:NVME-BASE-2.4, Rev. 2.4, §8.1.24, Figure 756, 文件頁 691-692, PDF 頁 717-718

Base Figure 756 · RPMB Device Configuration Block Data Structure

一句話重點

Base756-1WPC 的兩個 bit 只控制進入請求,不儲存 namespace 目前的 WPS。

來源:Base 2.4 §8.1.24

來源:NVME-BASE-2.4, Rev. 2.4, §8.1.24, Figure 756, 文件頁 691-692, PDF 頁 717-718

用例子讀懂

Base756-2Device Configuration Block byte2=02h:PWPC=1、WPUPCC=0,所以只開放進入永久狀態的這項控制條件。重設後 byte2 的這兩個 bit 清零,先前已成功設為 3 的 namespace 仍是 3。

圖表組 04 · 把查詢、設定與成功完成接起來 · 7 張圖表

07.10.Figure 93 定位 NSID 與 CDW;Figures 198/201 分開查詢選擇與回覆,Figures 464/541 接上設定參數。

回到本節的解釋與範例

Base Figure 93 · Common Command Format

一句話重點

Base93-1NSID 選對象,CDW10 選 Feature,CDW11 放 WPS;序號與欄位值不可混淆。

來源:Base 2.4 §4.1.1

來源:NVME-BASE-2.4, Rev. 2.4, §4.1.1, Figure 93, 文件頁 140-142, PDF 頁 166-168

用例子讀懂

Base93-2namespace7 的 NSID 位於 bytes7:4;WPS=1 位於 CDW11 bits2:0,CDW11 的 byte offset 是 11×4=44。offset44 是欄位的位置,不是 namespace ID 或狀態。

offset
相對於資料結構起點的位移;本篇byte offset以byte計算,從0起算。

先看 SEL,再決定如何解讀 DW0

07.11.以下非零 SEL 的討論以控制器支援 SSFS 為前提。成功 Get 的回覆格式不能只根據 DW0 數字猜測。

欄位或圖上標示讀值與條件帶入例子後的結論
CDW10 FID bits7:0、SEL bits10:8FID84h;SEL0問current,1問default,2問saved,3問capabilities;4~7保留,bits31:11保留。SEL3需左移8位:00000384h。
SEL0/1/2 與 DPTR0成功回WPS;1因沒有default回Invalid Field in Command。2因不可保存轉問default,所以也不能取得WPS。沒有屬性結構,忽略DPTR。需要目前保護狀態就用SEL0,不使用default或saved猜測。
SEL3 DW0 bit2:CHANG只要此Feature任一屬性有可變更值,就回1,即使目前值不可改。不能因CHANG1就畫出Permanent的解除箭頭。
SEL3 DW0 bit1:NSSPEC1表示namespace 作用範圍。WPS針對所選namespace,其他控制器也須遵守。
SEL3 DW0 bit0:SVBL;bits31:3保留FID84h不可保存,SVBL0。6 = 4 + 2;能力三位元與WPS三位元剛好同寬,但語意不同。
來源:Base 2.4 §5.2.12 · Base 2.4 §5.2.12.2

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.12, Figure 197, 文件頁 209, PDF 頁 235

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.12, Figure 198, 文件頁 209-210, PDF 頁 235-236

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.12.2, Figure 201, 文件頁 212, PDF 頁 238

Base Figure 197 · Get Features – Data Pointer

一句話重點

Base197-1Get 不需要資料 buffer,也可以在完成項目裡回報 WPS。

來源:Base 2.4 §5.2.12

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.12, Figure 197, 文件頁 209, PDF 頁 235

用例子讀懂

Base197-2讀 namespace7 的 WPS 時,成功 CQE DW0=1 就是結果;預先配置的 buffer 未被寫入不代表控制器沒有回答。Figure197 規定無資料結構時忽略 DPTR。

Base Figure 198 · Get Features – Command Dword 10

一句話重點

Base198-1SEL 選的是要問的問題,本功能不提供每一種選項的有效值。

來源:Base 2.4 §5.2.12

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.12, Figure 198, 文件頁 209-210, PDF 頁 235-236

用例子讀懂

Base198-2FID84h 的 CDW10=00000084h 問 current;00000184h 問 default,卻因沒有 default 被拒絕。SEL=2 也不代表查前一次 WPS,因為它問的是通用 saved 值。

Base Figure 201 · Completion Queue Entry Dword 0 when Select is set to 11b

一句話重點

Base201-1CHANG 可以為 1,即使 namespace 目前已在不可改變的永久狀態。

來源:Base 2.4 §5.2.12.2

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.12.2, Figure 201, 文件頁 212, PDF 頁 238

用例子讀懂

Base201-2SEL3 成功回 DW0=6:bit2 CHANG=1、bit1 NSSPEC=1、bit0 SVBL=0。表示功能有可變更值、屬 namespace 作用範圍、不可保存;不是允許把目前 WPS3 解除,也不是第6種保護狀態。

Base Figure 463 · Set Features – Data Pointer

一句話重點

Base463-1Set 是否使用 DPTR 取決於 Feature 是否需要資料結構;FID84h 不需要。

來源:Base 2.4 §5.2.30

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30, Figure 463, 文件頁 456, PDF 頁 482

用例子讀懂

Base463-2設定 WPS=1 的 1 直接放 CDW11,不配置一個含 1 的資料 buffer 再把地址放 DPTR。Figure466 的 FID84h 列標示 Uses Data Buffer=No。

Base Figure 464 · Set Features – Command Dword 10

一句話重點

Base464-1SV 是保存請求,FID 是功能識別值;不使用 SV 不代表保護會在斷電後消失。

來源:Base 2.4 §5.2.30

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30, Figure 464, 文件頁 457, PDF 頁 483

用例子讀懂

Base464-2SV=0、FID84h 得 CDW10=00000084h;把 bit31 設為 1 得 80000084h,卻會對此不可保存的功能提出無效的保存要求。WPS=1 的跨斷電持續性仍由狀態規則決定。

把名稱、bit 編碼與回覆位置連起來

07.12.Set 的參數與 Get 的回覆共用 WPS 格式,但所在的位置不同。只有命令成功時,才按該次 SEL 的回覆格式解讀結果。

欄位或圖上標示讀值與條件帶入例子後的結論
bits2:0:WPS=000b/001b0:No Write Protect;1:Write Protect。Set CDW11=00000001h 要求進入一般保護。
WPS=010b/011b2:Until Power Cycle;3:Permanent。3 是狀態代碼,不是兩個可獨立開關的保護 flags。
WPS=100b~111b;bits31:34~7 是保留代碼,高 29 bits 也是保留。能力查詢 DW0=6 不用此表;用此表硬解會讀到保留代碼。
Get 成功且 SEL≠3:CQE DW0以 Figure541 格式回覆;本功能沒有 default,實務查目前值使用 SEL=0。Get 命令不以 CDW11 的舊內容作為回覆,主機讀的是 completion DW0。
來源:Base 2.4 §5.2.30.1.38

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.1.38, Figure 541, 文件頁 512, PDF 頁 538

Base Figure 541 · Write Protection – Command Dword 11

一句話重點

Base541-1WPS 是低 3 bits 的狀態代碼;成功的非能力查詢把同一格式放在 CQE DW0。

來源:Base 2.4 §5.2.30.1.38

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.1.38, Figure 541, 文件頁 512, PDF 頁 538

用例子讀懂

Base541-2CDW11=00000003h 表示 Permanent,雖然二進位是 011b,仍只選一個狀態。Get SEL=0 成功回 DW0=00000002h 才表示目前 Until Power Cycle;它不是 NWPC bit1 的能力回報。

圖表組 05 · 保護後,哪些命令仍能做什麼 · 1 張圖表

07.13.Figure 737 的兩個命令集合與三項註腳一起讀;Figure 103 再確認保護錯誤的含義。

回到本節的解釋與範例

把兩個命令集合與三項註腳讀完整

07.14.Figure737 不是 bit 表。左右兩欄分別屬 Admin 與 NVM Command Set;上下相鄰的命令沒有一一配對或執行先後關係。以下按共同限制重新編排,保留全部列出的命令。

Admin
Administrative,建立、設定、查詢或管理 controller 與 queue 的控制路徑。
欄位或圖上標示讀值與條件帶入例子後的結論
Admin:無特別上標的列Device Self-test、Get Features、Get Log Page、Identify、Namespace Attachment,依各命令規則正常處理。正常處理仍可能因其他原因失敗,不保證每筆成功。
Admin:註腳1Directive Send、Security Receive、Security Send、Set Features、Vendor Specific;若指定動作嘗試修改該 namespace 非揮發媒體,必須失敗。Set Features列在表內不代表可以略過WPS轉換限制。
Admin:Directive Receive/註腳3嘗試配置Streams資源時,以Namespace is Write Protected中止。同一命令的其他操作仍需按自己的定義處理。
NVM:無特別上標的列Compare、Read、Reservation Register、Reservation Report、Reservation Acquire、Reservation Release、Verify,正常處理。保護媒體不等於完全禁止查詢或存取協調。
NVM:註腳1Dataset Management、Vendor Specific;嘗試修改該namespace非揮發媒體的動作必須失敗。不能僅看到Dataset Management在表中就說所有動作都允許。
NVM:Flush/註腳2必須成功且無作用;該namespace所有volatile write cache資料與metadata已在進入保護時提交到非揮發媒體。不是讓Flush在已保護的媒體上繼續寫回舊資料。
表後三種拒絕條件未列出的命令:指定受保護NSID,或指定未受保護NSID但會改到受保護namespace,或未指定NSID卻會改到受保護namespace。依次可用Write、跨namespace的Format NVM、會影響受保護namespace的Sanitize理解。
volatile write cache
揮發性寫入快取;尚未提交到非揮發媒體的資料可能暫存在這裡。
來源:Base 2.4 §8.1.18.2

來源:NVME-BASE-2.4, Rev. 2.4, §8.1.18.2, Figure 737, 文件頁 665-666, PDF 頁 691-692

Base Figure 737 · Commands Allowed when Specifying a Write Protected NSID

一句話重點

Base737-1先找命令名稱,再看上標註腳,最後判斷這次動作會不會修改受保護媒體。

來源:Base 2.4 §8.1.18.2

來源:NVME-BASE-2.4, Rev. 2.4, §8.1.18.2, Figure 737, 文件頁 665-666, PDF 頁 691-692

用例子讀懂

Base737-2Dataset Management 在右欄卻帶註腳1;若該次動作嘗試修改受保護 namespace 的非揮發媒體,必須失敗。Flush 的註腳2則明確規定成功且不產生作用,兩者不能用同一句「允許」概括。

圖表組 06 · 用正確的狀態與錯誤解釋結果 · 3 張圖表

07.15.Figure 213 只取 AMRO;Figures 103/554 比較錯誤原因,不把健康 bit 當成 WPS。

回到本節的解釋與範例

以狀態類型與代碼區分三種失敗

07.16.本篇只取Figure103的20h與Figure554的0Dh、0Eh。SCT是狀態碼類型,SC是該類型內的代碼;以下不是整個CQE Status欄的16-bit編碼。

SCT
Status Code Type,完成狀態碼所屬的類型。
SC
Status Code,在指定SCT類型內的完成狀態代碼。
欄位或圖上標示讀值與條件帶入例子後的結論
SCT0/SC20h:Namespace is Write Protected命令受到本狀態機的寫入保護禁止。Write指定已受保護的namespace,不能只用另一控制器重送來繞過。
SCT1/SC0Dh:Feature Identifier Not Saveable所選Feature不支援保存值。FID84h搭SV1,不能解讀成「永久保護能力不支援」。
SCT1/SC0Eh:Feature Not ChangeableFeature值不支援變更,或此時該值不能改。原WPS2/3的改變請求、WPC不允許的進入要求、MDS1下進入2,都屬本篇相關情境。
來源:Base 2.4 §4.2.1 · Base 2.4 §5.2.30.4

來源:NVME-BASE-2.4, Rev. 2.4, §4.2.1, Figure 103, 文件頁 149, PDF 頁 175

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.4, Figure 554, 文件頁 519, PDF 頁 545

Base Figure 103 · Status Code – Generic Command Status Values

一句話重點

Base103-1Namespace is Write Protected 表示命令被保護限制,不是進入保護的要求被拒絕。

來源:Base 2.4 §4.2.1

來源:NVME-BASE-2.4, Rev. 2.4, §4.2.1, Figure 103, 文件頁 149, PDF 頁 175

用例子讀懂

Base103-2受保護namespace的Write回SCT=0、SC=20h;要求把WPS2改成0則用Figure554的Feature Not Changeable。先辨認原命令在做什麼,再比較完成狀態。

只讀 SMART 的相關位元,不借用它代表設定

07.17.Figure213 只取 byte0 Critical Warning 的 bit3。此處不把其他健康欄位納入教學範圍。

欄位或圖上標示讀值與條件帶入例子後的結論
byte0 bit3:All Media Read-Only (AMRO)1回報全部媒體處於唯讀狀況,但不可僅因Namespace Write Protection狀態改變造成唯讀就設1。AMRO0不能證明namespace7的WPS是0。
健康欄位與Feature的界線用Get FID84h查WPS;不要把AMRO當另一份WPS或狀態機的事件旗標。WPS0也只表示本機制未設保護,不保證媒體健康且所有Write成功。
來源:Base 2.4 §5.2.13.1.3

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13.1.3, Figure 213, 文件頁 221, PDF 頁 247

Base Figure 213 · SMART / Health Information Log

一句話重點

Base213-1AMRO 是健康警告,不是「有人把 namespace 設成 Write Protect」的通知。

來源:Base 2.4 §5.2.13.1.3

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13.1.3, Figure 213, 文件頁 221, PDF 頁 247

用例子讀懂

Base213-2namespace7 的 WPS=1 且 SMART Critical Warning bit3=0 並不矛盾。即使所有namespace都用本功能保護,也不能只因此把AMRO設為1。

Base Figure 554 · Set Features – Command Specific Status Values

一句話重點

Base554-1Feature Not Saveable 與 Not Changeable 分別拒絕保存要求與當下不可執行的值變更。

來源:Base 2.4 §5.2.30.4

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.4, Figure 554, 文件頁 519, PDF 頁 545

用例子讀懂

Base554-2WPS0時錯送SV1:不可保存;WPS2時要求改成0:不可改變。兩者都不是用重送相同參數就能證明已設好狀態。

學完後想一想

1. WPS=2,沒有斷電的控制器重設後,能用 Set WPS=0 解除嗎?

08.01.不能。這種重設維持狀態2,Set不能改變它;power cycle才沿著圖上的特殊箭頭回到0。WPUPCC清零只是關閉之後的進入許可,不是解除現有保護。

來源

來源:NVME-BASE-2.4, Rev. 2.4, §8.1.18; 5.2.30.1.38, 文件頁 512-513,664-665, PDF 頁 538-539,690-691

來源:NVME-BASE-2.4, Rev. 2.4, §8.1.24, 文件頁 691-692, PDF 頁 717-718

2. NWPC=07h、PWPC=1,是否代表任何 namespace 現在都能進入永久保護?

08.02.還要看目前狀態。0或1才有進入3的Set路徑;原本在2時,改成3仍會被拒絕。NWPC是支援,PWPC是許可,兩者都不取代狀態機。

來源

來源:NVME-BASE-2.4, Rev. 2.4, §8.1.18; 5.2.30.1.38, 文件頁 512-513,664-665, PDF 頁 538-539,690-691

來源:NVME-BASE-2.4, Rev. 2.4, §8.1.18; 5.2.30.1.38, 文件頁 512-513,664-665, PDF 頁 538-539,690-691

3. 成功的能力查詢回 DW0=6,能否說目前 WPS=6,而且可解除永久保護?

08.03.兩個結論都不對。SEL3的6解成CHANG1、NSSPEC1、SVBL0;CHANG表示此Feature有可變更的值,不保證目前值可改。查WPS要另用SEL0。

來源

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.12; 5.2.12.2; 5.2.30.1.38, 文件頁 209-212,512, PDF 頁 235-238,538

4. 保護後 Flush 為什麼成功卻不寫回資料?

08.04.轉入保護時已要求提交該namespace全部揮發性寫入快取資料與metadata。因此這裡的成功不代表還有一次額外寫入,也不能反推其他未受保護namespace的Flush同樣無作用。

來源

來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.1.38, 文件頁 512-513, PDF 頁 538-539

來源:NVME-BASE-2.4, Rev. 2.4, §8.1.18.2, 文件頁 665-666, PDF 頁 691-692

5. 7受保護、8未受保護,把 Format NVM 的 NSID 填8就一定能執行嗎?

08.05.不一定。還要判斷這次format真正涵蓋哪些namespace;若也會修改7,就必須因保護而拒絕。保護依實際影響判斷,不只看命令上的目標編號。

來源

來源:NVME-BASE-2.4, Rev. 2.4, §8.1.18.2, 文件頁 665-666, PDF 頁 691-692