保護的對象與邊界
01-01設定跟著 namespace,所有附接它的控制器都要遵守。先分清資料對象與傳送命令的控制器,再看會影響多個 namespace 的操作。
NVMe · 規格與原理
00.01.一份已寫好的資料要繼續提供讀取,又要避免後續命令改動它,可以對所在的 namespace 設定寫入保護。Namespace Write Protection 不只是一個開關:它有可解除、直到斷電、永久等不同狀態,並把裝置支援、進入許可與實際保護分開。本篇把這些關係接到 FID 84h,最後說明保護如何改變命令處理。
01-01設定跟著 namespace,所有附接它的控制器都要遵守。先分清資料對象與傳送命令的控制器,再看會影響多個 namespace 的操作。
02-01四種狀態各有允許的進入與離開路徑。Set Features、控制器重設與 power cycle 造成的結果不同,圖上的箭頭必須帶著事件讀。
03-01NWPC 回答能不能支援,WPC 決定特定進入要求是否獲准,WPS 回報目前狀態。設定成功還包含將既有寫入快取提交到媒體。
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.Namespace Write Protection 讓主機控制單一 namespace 的寫入保護狀態。支援這項能力時,No Write Protect 與 Write Protect 必備;Until Power Cycle 與 Permanent 兩種狀態選用。namespace 建立時從 No Write Protect 開始;同一 namespace 的狀態須由所有附接它的控制器共同遵守。
來源: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 是互斥的狀態代碼,不是可自由組合的位元遮罩。
來源: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 兩種功能疊加,而是另外定義的一個狀態。
01.05.裝置可以只提供 0 與 1,仍符合這項選用功能的最低要求。想用 2 或 3,必須先確認控制器宣告支援。原表的 M 是「有實作 Namespace Write Protection 時必備」,不能讀成每一台 NVMe 裝置都一定有這項功能。
01.06.若控制器 A、B 都附接 namespace 7,由 A 設好的保護不能透過 B 繞過。規格要求附接該 namespace 的任何控制器都遵守它的保護狀態。反過來,namespace 8 是另一個設定對象;保護 7 不等於自動把 8 的 WPS 也改成 1。之後會再討論影響多個 namespace 的命令。
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 不解除它。
來源: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,永久狀態維持。
來源: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」就以為一律不可解除;是否能解除,要看完整的狀態名稱與目前代碼。
02.04.從 0 或 1 可進入 2,但沒有用 Set Features 從 2 回到 0、1 或前進到 3 的箭頭。要求改變會被拒絕。2 回到 0 的特殊箭頭是 power cycle;若只是控制器層級重設而沒有 power cycle,仍然是 2。日常說的「重開」太含糊,必須辨認實際發生的是哪種事件。
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 的值替代狀態規則。
02.07.指定的 Revert to Subsystem Manufacturing Settings Personality 真正生效後,1、2 等非永久狀態回到 0;3 保留。它不是一般 Controller Level Reset 的別名,也不是本篇 state machine 裡的 Set WPS 解除命令。這裡只說它對 WPS 的結果,不把這項管理操作當作一般解除流程。
03.01.NWPC 宣告控制器支援哪些狀態;RPMB 的 WPC 控制是否允許命令進入狀態 2 或 3;FID 84h 的 WPS 才是 namespace 目前的狀態。WPUPCC=0 或 PWPC=0 會阻止對應的進入要求。MDS=1 的多 domain subsystem 禁止使用狀態 2,即使相關能力與控制位已設為 1。
來源: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 的支援。
來源: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 也清零。
來源: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 是不是唯讀來替代。
03.05.WPC 不在 FID 84h 的 CDW11,也不屬於 namespace 的 WPS。它在 RPMB target 0 的 Device Configuration Block 內;RPMB 透過認證與防重播機制存取,不能把一般 namespace 的 Write 命令當作修改 WPC 的方法。本篇只需要理解這個控制欄位與 FID 84h 的關係,不需要先學完整訊息交換才能理解狀態機。
| 觀察到的值 | 它回答的問題 | 不能推出的結論 |
|---|---|---|
| NWPC=03h | 支援0/1及2,不支援3 | 目前已永久保護 |
| WPC=03h | 允許處理進入2與3的要求 | 所有namespace已保護 |
| WPS=3 | 這個namespace已永久保護 | 這是一份支援bitmap |
| MDS=1 | 多domain;禁止進入2 | 禁止所有寫入保護 |
03.06.假設 PWPC 曾為 1,namespace 7 已成功進入永久保護。控制器重設後 PWPC 清為 0,意思是後續嘗試讓其他 namespace 進入永久保護時,必須重新滿足控制條件;namespace 7 本來的永久保護仍在。WPS=2 經沒有斷電的控制器重設也保留,雖然 WPUPCC 此時已清零。
03.07.狀態 2 的解除需要 namespace 與它所附接的所有控制器同時經歷 power cycle。多 domain 配置不能以單一局部電源事件保證這件事,因此規格禁止在 MDS=1 時使用狀態 2;要求進入時回 Feature Not Changeable。這個條件針對狀態 2,不應自行擴大成多 domain 配置禁止所有寫入保護。
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 寫入非揮發媒體。
來源: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 的限制。
來源: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。共享設定需要主機間協調。
來源:NVME-BASE-2.4, Rev. 2.4, §4.4, 文件頁 168-169, PDF 頁 194-195
04.04.成功 Set Features 完成後才提交的命令必須使用新設定;更早已提交的命令可能使用或不使用新設定。要劃清前後兩批,主機宜先讓處理中的命令完成,再修改設定。成功完成不能早於 Feature 屬性設定完成。
來源: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 改成查到的值,它只回報狀態。
04.06.SSFS 支援非零 SEL 時,SEL=3 的 CDW10 是 00000384h,回覆改成能力格式。假設 DW0=6,表示 CHANG=1、NSSPEC=1、SVBL=0,不是 WPS=6。尤其即使已永久保護,CHANG 仍可表示這個 Feature 曾有可變更的值;它不是解除永久保護的許可。SEL=2 也不能拿來尋找「上次保護前的值」:不可保存時會轉問 default,而本功能沒有 default。
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,還要協調對這份設定的存取;本規格不定義主機之間的協調協定。
04.10.本文使用單一 目前可存取的 NSID,是為了明確選到目標。FFFFFFFFh 的 Set 和 Get 行為不對稱;Set 在單 domain 可涵蓋該控制器附接的全部 namespace,但每個目標仍受自己的狀態限制,不能據此推論多目標更新的原子性。Get 不用這個值回一張全體 WPS 清單。active 表示已附接於本控制器;inactive 與 invalid 的錯誤也不同,欄位教學會把兩者分開。
05.01.Figure 737 列出對受保護 NSID 正常處理的命令,但註腳仍限制會修改非揮發媒體的動作。Flush 成功且不產生作用;Directive Receive 若要求配置 Streams 資源則回 Namespace is Write Protected。未列出的命令只要符合本節列出的受保護目標或跨 namespace 修改條件,就會被拒絕。
來源: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但也修改受保護的7 | Namespace is Write Protected | 實際影響包含受保護namespace |
| Sanitize會修改受保護namespace | Namespace is Write Protected | 沒有指定NSID也須遵守保護 |
05.04.受保護 NSID 的 Flush 必須成功且不產生作用。原因是進入保護時,該 namespace 的所有揮發性快取資料與 metadata 已被寫入非揮發媒體。這裡沒有授權 Flush 在保護後偷偷修改資料,也沒有說所有情況下的 Flush 都不需要做事;這是針對已受保護 namespace 的規則。
05.05.這個命令名稱看起來像只接收資料,但其配置 Streams 資源的操作另有規則:對受保護 namespace 執行時,必須以 Namespace is Write Protected 中止。這個例子提醒讀者:資料傳送方向不能單獨代表操作是否改變狀態。
05.06.未列在 Figure 737 的命令,若直接指定受保護 namespace,會受到拒絕規則約束。另一種情況是命令指定未受保護的 namespace 8,實際操作卻會修改受保護的 7;規格以 Format NVM 為例,仍須拒絕。再例如 Sanitize 沒有指定某個 NSID,只要執行會修改受保護 namespace,仍須拒絕。不能靠改填目標或省略 NSID 繞過保護。
06.01.主機應以 Get FID 84h 查 namespace 寫入保護狀態。控制器不得只因本狀態機造成的唯讀條件,就把 SMART Critical Warning 的 All Media Read-Only 設為 1;AMRO=0 也不能證明 namespace 沒有設保護。外部寫入保護系統與本機制組合的結果不在此規格定義內。
來源: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 表示不支援保存要求。它們分別出現在命令執行、狀態轉換與保存設定的問題上。
來源: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 猜測。
06.04.解除本功能不代表下一筆 Write 在任何條件下都會成功。其他錯誤、媒體狀況或外部保護仍可能影響操作;本節沒有把它們都收編成 WPS 的狀態。若外部寫入保護機制也存在,本規格不定義兩者組合的所有結果,不能自行編造優先順序。
| 想回答的問題 | 查看哪裡 | 代表性判讀 |
|---|---|---|
| namespace7目前是哪種保護? | Get FID84h、SEL0的WPS | 1是一般Write Protect |
| 裝置是否支援永久保護? | Identify的NWPC bit2 | 1是支援,不是已進入 |
| 為何要求改變狀態失敗? | 完成狀態+原狀態/控制條件 | WPS2要求0:Feature Not Changeable |
| 是否回報全體媒體唯讀警告? | SMART的AMRO | 不能只因WPS變化而設1 |
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.01.以下依概念整理規格中的圖表。每組先說明讀取順序與要判斷的問題,接著列出各圖的欄位或行為說明。可以由正文的連結跳到對應組別,也可以用這一節檢查自己能否把欄位連回完整操作。
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 Protect | 0 為未設保護,1 為一般保護;兩者都跨 power cycle 與 Controller Level Reset 保留。 | 斷電不會自動把 1 解除成 0。 |
| Write Protect Until Power Cycle | 2 在沒有 power cycle 的 Controller Level Reset 後保留;power cycle 才使其回到 0。 | 僅重設控制器後,仍不能送 Set WPS=0 來解除 2。 |
| Permanent Write Protect | 3 是永久保護;兩種事件後都保持。 | power cycle 不提供 3 → 0 的路徑。 |
| Persistent Across 欄的讀法 | 先選目前狀態,再選實際事件;No 表示不保留原狀態,轉到哪裡要結合正文。 | 狀態 2 的 No 不是功能消失,而是狀態轉為 0。 |
來源:NVME-BASE-2.4, Rev. 2.4, §8.1.18, Figure 735, 文件頁 664, PDF 頁 690
Base735-1M/O 表示支援要求;兩個 persistence 欄表示事件發生後是否仍保持原狀態。
來源: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。
07.04.Figure 736 看箭頭與事件,Figure 735 看事件後是否保留;兩張圖回答不同問題。
回到本節的解釋與範例07.05.只取 Figure93 的 NSID、CDW 位置,Figure463 的資料指標用途、Figure464 的 SV/FID,以及 Figure466 的 FID84h 列與註腳2、8。
| 欄位或圖上標示 | 讀值與條件 | 帶入例子後的結論 |
|---|---|---|
| NSID bytes7:4:active、inactive、invalid | active 已附接本控制器;inactive 已配置但未附接;invalid 是無效識別值。通用格式對 inactive 回 Invalid Field in Command,對 invalid 回 Invalid Namespace or Format,除非另有特例。 | 不存在的 ID 和存在但未附接的 ID 不要寫成同一種「不可用」。 |
| NSID=FFFFFFFFh | Set:MDS=0 通常設定本控制器附接的所有 namespace,MDS=1 拒絕。Get:本功能沒有全體查詢特例,回 Invalid Namespace or Format。 | 不從一次 broadcast Set 推論每個目標都可轉換,也不假設更新原子性。 |
| CDW10 bytes43:40 | SV bit31;FID bits7:0;bits30:8 保留。FID84h 不可保存,使用 SV=0。 | (0 << 31) | 84h = 00000084h。 |
| CDW11 bytes47:44;DPTR bytes39:24 | CDW11 帶 WPS;Figure463 定義的 DPTR 不用來放本 Feature 屬性。 | byte offset44 = 11×4;不是把 WPS 左移44位。 |
| Figure466:84h 列 Scope/Uses Data Buffer | Scope=Namespace;Uses Data Buffer=No。 | 不是只對收到命令的控制器生效。 |
| Figure466:註腳2與8 | 持續性欄只供不可保存 Feature 使用;84h 正是不可保存,但註腳8仍要求使用專屬狀態規則。 | WPS1保留、WPS2在power cycle清除,不能一起讀成No。 |
來源: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
Base466-1FID84h 的 No 帶註腳8,必須回到此 Feature 的狀態規則判斷持續性。
來源: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,也不把條文擴寫成所有同值請求必須失敗。 |
來源:NVME-BASE-2.4, Rev. 2.4, §8.1.18, Figure 736, 文件頁 664, PDF 頁 690
Base736-1圖上的普通箭頭由 Set Features 觸發,唯一標 Power Cycle 的箭頭是 2 回到 0。
來源: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 仍會被拒絕;必須尊重目前狀態,而不只檢查目的地能力。
07.07.Figure 338 的支援位、Figure 756 的控制位與 Figure 541 的狀態碼要分開解碼。
回到本節的解釋與範例07.08.Figure 338 很長;本篇只取 NWPC、CTRATT.MDS 與 ONCS.SSFS。其他未在此列出的能力 bit 有各自用途,不是全都保留。位置從 Identify Controller 結構起點起算。
| 欄位或圖上標示 | 讀值與條件 | 帶入例子後的結論 |
|---|---|---|
| NWPC byte 531:bit0 NWPWPS | 1 支援 No Write Protect/Write Protect;0 不支援本功能,bits1、2 也須為 0。 | NWPC=01h 已表示支援本功能的基本兩種狀態。 |
| NWPC bit1 WPUPCS | 1 支援 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 MDS | 1 支援多 domain;0 表示單 domain 且不支援多 domain 回報。 | 使用 (CTRATT >> 10) & 1;MDS=1 阻止進入 2。 |
| ONCS bytes 521:520:bit4 SSFS | 1 支援非零 SEL/SV;0 時不使用非零選項。特定 Feature 的限制仍優先適用。 | SSFS=1 不會讓不可保存的 FID84h 變成可以 SV=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-1NWPC 說明裝置能力,MDS 限制狀態 2,SSFS 決定是否能使用非零查詢選項。
來源: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。
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:WPUPCC | 0 拒絕要求進入 2 的 Set;1 允許處理該要求,但仍須符合能力與狀態條件。 | NWPC 支援且 WPC=01h,也不能忽略 MDS=1 的禁止。 |
| WPC bit1:PWPC | 0 拒絕要求進入 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 當成更多保護狀態。 |
來源:NVME-BASE-2.4, Rev. 2.4, §8.1.24, Figure 756, 文件頁 691-692, PDF 頁 717-718
Base756-1WPC 的兩個 bit 只控制進入請求,不儲存 namespace 目前的 WPS。
來源: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。
07.10.Figure 93 定位 NSID 與 CDW;Figures 198/201 分開查詢選擇與回覆,Figures 464/541 接上設定參數。
回到本節的解釋與範例Base93-1NSID 選對象,CDW10 選 Feature,CDW11 放 WPS;序號與欄位值不可混淆。
來源: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 或狀態。
07.11.以下非零 SEL 的討論以控制器支援 SSFS 為前提。成功 Get 的回覆格式不能只根據 DW0 數字猜測。
| 欄位或圖上標示 | 讀值與條件 | 帶入例子後的結論 |
|---|---|---|
| CDW10 FID bits7:0、SEL bits10:8 | FID84h;SEL0問current,1問default,2問saved,3問capabilities;4~7保留,bits31:11保留。 | SEL3需左移8位:00000384h。 |
| SEL0/1/2 與 DPTR | 0成功回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:NSSPEC | 1表示namespace 作用範圍。 | WPS針對所選namespace,其他控制器也須遵守。 |
| SEL3 DW0 bit0:SVBL;bits31:3保留 | FID84h不可保存,SVBL0。 | 6 = 4 + 2;能力三位元與WPS三位元剛好同寬,但語意不同。 |
來源: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
Base197-1Get 不需要資料 buffer,也可以在完成項目裡回報 WPS。
來源: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。
Base198-1SEL 選的是要問的問題,本功能不提供每一種選項的有效值。
來源: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 值。
Base201-1CHANG 可以為 1,即使 namespace 目前已在不可改變的永久狀態。
來源: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種保護狀態。
Base463-1Set 是否使用 DPTR 取決於 Feature 是否需要資料結構;FID84h 不需要。
來源: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。
Base464-1SV 是保存請求,FID 是功能識別值;不使用 SV 不代表保護會在斷電後消失。
來源: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 的跨斷電持續性仍由狀態規則決定。
07.12.Set 的參數與 Get 的回覆共用 WPS 格式,但所在的位置不同。只有命令成功時,才按該次 SEL 的回覆格式解讀結果。
| 欄位或圖上標示 | 讀值與條件 | 帶入例子後的結論 |
|---|---|---|
| bits2:0:WPS=000b/001b | 0:No Write Protect;1:Write Protect。 | Set CDW11=00000001h 要求進入一般保護。 |
| WPS=010b/011b | 2:Until Power Cycle;3:Permanent。 | 3 是狀態代碼,不是兩個可獨立開關的保護 flags。 |
| WPS=100b~111b;bits31:3 | 4~7 是保留代碼,高 29 bits 也是保留。 | 能力查詢 DW0=6 不用此表;用此表硬解會讀到保留代碼。 |
| Get 成功且 SEL≠3:CQE DW0 | 以 Figure541 格式回覆;本功能沒有 default,實務查目前值使用 SEL=0。 | Get 命令不以 CDW11 的舊內容作為回覆,主機讀的是 completion DW0。 |
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.1.38, Figure 541, 文件頁 512, PDF 頁 538
Base541-1WPS 是低 3 bits 的狀態代碼;成功的非能力查詢把同一格式放在 CQE DW0。
來源: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 的能力回報。
07.13.Figure 737 的兩個命令集合與三項註腳一起讀;Figure 103 再確認保護錯誤的含義。
回到本節的解釋與範例07.14.Figure737 不是 bit 表。左右兩欄分別屬 Admin 與 NVM Command Set;上下相鄰的命令沒有一一配對或執行先後關係。以下按共同限制重新編排,保留全部列出的命令。
| 欄位或圖上標示 | 讀值與條件 | 帶入例子後的結論 |
|---|---|---|
| Admin:無特別上標的列 | Device Self-test、Get Features、Get Log Page、Identify、Namespace Attachment,依各命令規則正常處理。 | 正常處理仍可能因其他原因失敗,不保證每筆成功。 |
| Admin:註腳1 | Directive 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:註腳1 | Dataset 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理解。 |
來源:NVME-BASE-2.4, Rev. 2.4, §8.1.18.2, Figure 737, 文件頁 665-666, PDF 頁 691-692
Base737-1先找命令名稱,再看上標註腳,最後判斷這次動作會不會修改受保護媒體。
來源: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則明確規定成功且不產生作用,兩者不能用同一句「允許」概括。
07.15.Figure 213 只取 AMRO;Figures 103/554 比較錯誤原因,不把健康 bit 當成 WPS。
回到本節的解釋與範例07.16.本篇只取Figure103的20h與Figure554的0Dh、0Eh。SCT是狀態碼類型,SC是該類型內的代碼;以下不是整個CQE Status欄的16-bit編碼。
| 欄位或圖上標示 | 讀值與條件 | 帶入例子後的結論 |
|---|---|---|
| SCT0/SC20h:Namespace is Write Protected | 命令受到本狀態機的寫入保護禁止。 | Write指定已受保護的namespace,不能只用另一控制器重送來繞過。 |
| SCT1/SC0Dh:Feature Identifier Not Saveable | 所選Feature不支援保存值。 | FID84h搭SV1,不能解讀成「永久保護能力不支援」。 |
| SCT1/SC0Eh:Feature Not Changeable | Feature值不支援變更,或此時該值不能改。 | 原WPS2/3的改變請求、WPC不允許的進入要求、MDS1下進入2,都屬本篇相關情境。 |
來源: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
Base103-1Namespace is Write Protected 表示命令被保護限制,不是進入保護的要求被拒絕。
來源: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。先辨認原命令在做什麼,再比較完成狀態。
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成功。 |
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13.1.3, Figure 213, 文件頁 221, PDF 頁 247
Base213-1AMRO 是健康警告,不是「有人把 namespace 設成 Write Protect」的通知。
來源: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。
Base554-1Feature Not Saveable 與 Not Changeable 分別拒絕保存要求與當下不可執行的值變更。
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.4, Figure 554, 文件頁 519, PDF 頁 545
Base554-2WPS0時錯送SV1:不可保存;WPS2時要求改成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
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
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
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
08.05.不一定。還要判斷這次format真正涵蓋哪些namespace;若也會修改7,就必須因保護而拒絕。保護依實際影響判斷,不只看命令上的目標編號。
來源:NVME-BASE-2.4, Rev. 2.4, §8.1.18.2, 文件頁 665-666, PDF 頁 691-692