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設定跟著 namespace,所有附接它的控制器都要遵守。先分清資料對象與傳送命令的控制器,再看會影響多個 namespace 的操作。
用事件追蹤狀態
02-01四種狀態各有允許的進入與離開路徑。Set Features、控制器重設與 power cycle 造成的結果不同,圖上的箭頭必須帶著事件讀。
- power cycle
- 電源循環,即斷電後重新上電;不等同於所有形式的控制器重設。
從能力走到成功設定
03-01NWPC 回答能不能支援,WPC 決定特定進入要求是否獲准,WPS 回報目前狀態。設定成功還包含將既有寫入快取提交到媒體。
- NWPC
- Namespace Write Protection Capabilities,控制器支援哪些保護狀態的位元欄位。
- WPC
- Write Protection Control,決定是否接受進入特定保護狀態之要求的控制欄位。
- WPS
- Write Protection State,namespace目前的寫入保護狀態代碼。
保護後如何使用與觀察
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
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
03 能力、進入許可與目前狀態是三件事
| 觀察到的值 | 它回答的問題 | 不能推出的結論 |
|---|---|---|
| NWPC=03h | 支援0/1及2,不支援3 | 目前已永久保護 |
| WPC=03h | 允許處理進入2與3的要求 | 所有namespace已保護 |
| WPS=3 | 這個namespace已永久保護 | 這是一份支援bitmap |
| MDS=1 | 多domain;禁止進入2 | 禁止所有寫入保護 |
- domain
- subsystem內用來界定通訊與故障影響的範圍;本篇用它判斷是否允許直到斷電的保護。
- MDS
- Multi-Domain Subsystem,Identify Controller中表示支援多domain的位元。
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的控制位。
- PWPC
- Permanent Write Protect Control,WPC內允許進入永久保護的控制位。
- RPMB
- Replay Protected Memory Block,使用認證與防重播機制存取的記憶區;本篇只取其WPC控制欄位。
來源: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
04 把查詢、設定與成功完成接起來
- metadata
- 隨 logical block 儲存的附加資料,可包含資料保護資訊,也可有其他用途。
- CDW
- CDW(Command Dword);命令中的 32-bit 欄位單位,例如 CDW10 的 10 是欄位 index,不是 byte offset。
- CQE
- Completion Queue Entry,CQ 中的一筆完成結果資料結構。
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 寫入非揮發媒體。
- active
- 已附接於處理命令之控制器的namespace狀態。
- NSID
- Namespace Identifier,controller 用來指向 namespace 的數值 handle;identifier 不等於 namespace 物件本身。
- SEL
- Select,Get Features中選擇目前值、預設值、已保存值或能力的欄位。
- SV
- Save,Set Features中要求保存屬性值的位元。
來源: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
05 保護後,哪些命令仍能做什麼
| 命令或情境 | 是否被寫入保護阻擋 | 原因 |
|---|---|---|
| Read/Compare/Verify | 正常處理;仍可能有其他錯誤 | 保護不封鎖這些操作 |
| Dataset Management修改受保護媒體 | 必須失敗 | 表內命令仍受註腳1約束 |
| 受保護NSID的Flush | 成功且無作用 | 進入保護時已提交快取 |
| Format指向8但也修改受保護的7 | Namespace is Write Protected | 實際影響包含受保護namespace |
| Sanitize會修改受保護namespace | Namespace is Write Protected | 沒有指定NSID也須遵守保護 |
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
06 用正確的狀態與錯誤解釋結果
| 想回答的問題 | 查看哪裡 | 代表性判讀 |
|---|---|---|
| namespace7目前是哪種保護? | Get FID84h、SEL0的WPS | 1是一般Write Protect |
| 裝置是否支援永久保護? | Identify的NWPC bit2 | 1是支援,不是已進入 |
| 為何要求改變狀態失敗? | 完成狀態+原狀態/控制條件 | WPS2要求0:Feature Not Changeable |
| 是否回報全體媒體唯讀警告? | SMART的AMRO | 不能只因WPS變化而設1 |
- AMRO
- All Media Read-Only,SMART健康資訊中表示全體媒體唯讀的警告位。
06.01.主機應以 Get FID 84h 查 namespace 寫入保護狀態。控制器不得只因本狀態機造成的唯讀條件,就把 SMART Critical Warning 的 All Media Read-Only 設為 1;AMRO=0 也不能證明 namespace 沒有設保護。外部寫入保護系統與本機制組合的結果不在此規格定義內。
來源:Base 2.4 §8.1.18.1
來源:NVME-BASE-2.4, Rev. 2.4, §8.1.18.1, 文件頁 665, PDF 頁 691
開著 Spec 的順向報告路徑
R-1先用本文的全貌與案例說明機制,再按下列 Base PDF 檢視器頁碼往後讀。共用頁從指定標題開始,在停止標題前結束;必要背景已在中文教學說明,不必為每個引用往返翻頁。
| 頁碼順序 | 章節起點 | 重點與停止位置 |
|---|---|---|
| R1 · Base PDF 538–539 | §5.2.30.1.38 | 從 Namespace Write Protection Config 開始,用 Figure541 讀WPS編碼,再說不可保存、沒有default、拒絕轉換的條件,以及下一頁的快取提交。 在 §5.2.30.1.39 前停止。 |
| R2 · Base PDF 690–692 | §8.1.18 | 從 Namespace Write Protection 標題開始。Figure735比較四種狀態,Figure736沿箭頭解釋事件,Theory of Operation接能力與共享保護,Figure737連同下一頁三項註腳說明命令。 在 §8.1.19 前停止。 |
| R3 · Base PDF 718 | §8.1.24 · Figure756 byte2 | 最後只補看Device Configuration Block的WPC byte2,對照PWPC、WPUPCC與重設清零。不要從此展開其餘RPMB訊息表。 在 Figure757 前停止。 |
- Device Configuration Block
- RPMB target0的裝置設定資料結構,WPC位於其中byte2。
學完後想一想
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


Comments