NVMe Command and Feature Lockdown:查詢、限制範圍與持續性
00.01.Command and Feature Lockdown 處理的是「哪些管理操作,在什麼入口、哪些控制器上不准執行」。理解它需要把能力、目前狀態與修改命令接起來,再分清限制何時解除、斷電後是否保留。本文以一個 FID 的限制與讀回為例,從全貌走到命令欄位、兩種 Log 格式與必要的持續性例外。
- Lockdown
- 本篇指 Command and Feature Lockdown:以操作種類、接收介面與控制器範圍限制管理操作的機制。
- FID
- Feature Identifier;指定要讀取或設定哪一項 Feature 的編號。
這篇的主軸
先知道能限制什麼
01-01先查裝置是否支援整體限制或逐一指定控制器,再查哪些操作允許被禁止。功能存在、操作受支援、操作可禁止,是三個不同問題。
把限制範圍說清楚
02-01依序選操作、接收入口與控制器。只禁止一項設定、只限制某個入口,或只選某台控制器,會得到不同的影響範圍。
查詢要能驗證設定
03-01一般格式看全體共同項目;增強格式看指定控制器或全體彙整,再分辨某項是否所有控制器都符合。用相同條件讀回才有比較意義。
理解限制的生命週期
04-01限制可以用命令解除;經過斷電循環後是否仍保留,還要看最初選的控制器範圍與持續性設定。最後補足認證解凍與廠商定義的必要條件。
00.02.適合學過 OS、Computer Organization 並了解 SSD 基本概念的讀者。以 PCIe 主機管理流程為主要情境;Management Endpoint 只解釋 Base 明載的關係。所有控制器編號、可禁止清單及命令編碼案例均為說明性範例,實際可用項目由裝置能力決定。
- Management Endpoint
- 帶外管理接收入口;與主機的 Admin Submission Queue 分開選擇限制。
- PCIe
- PCI Express,NVMe memory-based controller 使用的 transport 與裝置互連。
把主軸連起來
00.03.可以用一個問題帶著讀:如果只想限制控制器 7 經 Admin Queue 修改 FID 06h,應查哪些能力、送哪些參數、用什麼回覆證明限制成立?沿著這條線,清單、欄位與錯誤碼才有各自的位置。
- Admin
- Administrative,建立、設定、查詢或管理 controller 與 queue 的控制路徑。
00.04.中文教學先補足每一步的理由,再在問答前整理相關規格圖表的欄位關係。兩種 Log 的長度、控制器編號、代碼清單與 UUID 索引會各自演算,避免只記住縮寫而失去它所描述的對象。
- UUID
- Universally Unique Identifier;128-bit 識別值,本篇用來區分同一廠商 FID 的不同定義。
開著 Spec 的順向報告路徑
R-1先用本文的全貌、流程與案例說明目的,再依下列 Base PDF 檢視器頁碼向後翻。共用頁只讀指定起始標題到停止標題;不必為每個必要引用往返翻頁,中文教學已集中解釋其欄位與條件。
| 翻頁順序 | 主範圍 | 重點與停止位置 |
|---|---|---|
| R1 · Base PDF 305–309 | §5.2.13.1.20 | 從 Command and Feature Lockdown 標題起:查詢選擇 → 一般清單 → 增強外框與描述器。用 A/B 例子比較全體共同項目與部分控制器項目。 在 §5.2.13.1.21 前停下。 |
| R2 · Base PDF 431–434 | §5.2.16 | 從 Lockdown command 標題起:用 controller7/FID06h 算 CDW10、14,再分清設定失敗與後續命令被禁止。 在 §5.2.17 前停下。 |
| R3 · Base PDF 623–625 | §8.1.5 | 從 Command and Feature Lockdown 標題起,收束介面、能力與持續性規則;以 CSEL0 對照 CSEL1/2 的 power cycle 結果。 在 §8.1.6 前停下。 |
- power cycle
- 整個指定裝置或 subsystem 的電源循環;本篇不能以一般 Controller Reset 代替。
- CDW
- CDW(Command Dword);命令中的 32-bit 欄位單位,例如 CDW10 的 10 是欄位 index,不是 byte offset。
01 先理解:限制的是哪個操作從哪裡進來
- 先說清楚:要限制哪個操作、接收介面與控制器集合。
- Identify 查 CFLS/CCFLS,再讀 LID14h 的可禁止清單。
- Lockdown 填 SCP、OFI、IFC、CSEL/CSS、PRHBT,等完成。
- 用相同範圍讀 LID14h 的目前禁止清單,確認設定結果。
- 後續符合條件的命令被拒絕;解除與 power cycle 另依持續性規則判斷。
- CCFLS
- Controller-scoped Command and Feature Lockdown Supported;可選控制器範圍的擴充支援位元。
- PRHBT
- Prohibit;1 要求禁止,0 要求允許,作用對象由其餘選擇欄位決定。
- CFLS
- Command and Feature Lockdown Supported;基本 Lockdown 支援位元。
- CSEL
- Controller Select;選全部、單一或某 primary 所屬 secondary 控制器集合。
- CSS
- Controller Select Specific;在本命令 CDW14 中依 CSEL 提供目標或 primary 控制器編號。
- IFC
- Interface;指定受限制操作從哪個介面收到時套用限制。
- OFI
- Opcode or Feature Identifier;Lockdown 要禁止或允許的代碼,其種類由 SCP 選定。
- SCP
- Scope;指定代碼屬於 Admin opcode、Set Features FID 或管理介面命令集。
01.01.Command and Feature Lockdown 讓主機限制特定管理命令,或 Set Features 對某個 FID 的設定操作。限制同時有操作種類、接收介面與控制器範圍;LID 14h 用來查可禁止項目與目前禁止狀態,Lockdown 命令用來改變它們。
- LID
- Log Page Identifier;指定要讀取哪一種 log page 的編號。
來源:Base 2.4 §8.1.5
來源:NVME-BASE-2.4, Rev. 2.4, §8.1.5, 文件頁 597-599, PDF 頁 623-625
02 先查支援層級,再查可禁止項目
02.01.Identify Controller 的 OACS.CFLS 表示基本 Lockdown 能力,CCFLS 表示可選控制器的擴充能力。CFLS=1 保證 CSEL=0 與 LID 14h;CCFLS=1 還要求 CSEL=1、2 與增強版 Log。每個 OFI 能否被禁止仍需查清單。
- OACS
- Optional Admin Command Support;Identify Controller 的選用管理命令與功能能力位元欄位。
來源:Base 2.4 §8.1.5
來源:NVME-BASE-2.4, Rev. 2.4, §8.1.5, 文件頁 599, PDF 頁 625
03 介面與控制器是兩個獨立選擇
| 固定條件 | 改變的欄位 | 限制涵蓋的對象 |
|---|---|---|
| FID06h、Admin Queue | CSEL0 | 全部控制器 |
| FID06h、Admin Queue | CSEL1、CSS7 | 控制器 7 |
| FID06h、Admin Queue | CSEL2、CSS7 | primary7 所屬 secondaries,非 primary7 本身 |
| FID06h、controller7 | IFC 由 0 改 2 | 從 Admin Queue 改為 Management Endpoint |
03.01.IFC 選命令接收介面:00b 為 Admin Submission Queue,01b 為該 Queue 加 Management Endpoint,10b 為 Management Endpoint。CSEL 選全部控制器、單一控制器或某 primary 的 secondary controllers,CSS 再提供所需控制器編號。
- Admin Submission Queue
- 主機提交管理命令的佇列,本文也簡稱 Admin Queue。
- secondary
- 附屬控制器;本篇只需知道其與 primary 的所屬關係,不以名稱推論效能或優先級。
- primary
- 主要控制器;本篇 CSEL=2 用它的 Identifier 選其所屬 secondary 控制器集合。
來源:Base 2.4 §5.2.16
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.16, 文件頁 406-407, PDF 頁 432-433
04 把 LID 14h 的查詢問題寫完整
04.01.LID 14h 的 SCP 選項目種類,CNTTS=00b 查可禁止、01b 查 Admin Queue 目前禁止、10b 查 Management Endpoint 目前禁止。ELPF=0 使用一般格式;ELPF=1 使用增強格式,並以 LSI.CNTLID 選控制器,FFFFh 查所有控制器。
- CNTLID
- Controller Identifier;控制器的識別編號,增強 Log 查詢以 FFFFh 指定全體。
- CNTTS
- Contents;選可禁止清單,或某種接收介面目前禁止的清單。
- LSI
- Log Specific Identifier;Get Log 中依 Log 種類解讀的 16-bit 識別值。
來源:Base 2.4 §5.2.13.1.20
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13.1.20, 文件頁 279-280, PDF 頁 305-306
05 一般格式:一串代碼代表全體共同的項目
| byte offset | 範例值 | 如何解讀 |
|---|---|---|
| 0 | 12h | CS1:Admin 已禁止;SS2:FID |
| 1~2 | 00 00 | 保留,不是清單內容 |
| 3 | 02h | LNGTH=2,直接計數 |
| 4~5 | 06 07 | 2 筆 FID:06h、07h |
| 6~511 | 保留 | 不解析為其他 FID |
- byte offset
- 以 byte 計算、相對結構起點的距離;索引 2 不一定代表 offset2。
- header
- 資料結構開頭的固定欄位區,用來說明後方內容的種類、長度或數量。
- offset
- offset;從指定起點算出的位移。它回答「離起點多遠」,不等於 index。
- LNGTH
- Length;一般格式代碼清單的 byte 數,直接計數,0 表示空清單。
05.01.一般 Log 固定 512 bytes,CFILA 回報查詢種類,LNGTH 直接表示後方代碼清單的 byte 數,清單從 byte 4 開始並由小到大排列。對全體控制器的可禁止項目與 Admin Queue 目前禁止項目,不能把一般清單當成任何一台控制器的聯集。
- CFILA
- Command and Feature Identifier List Attributes;一般 Log 中描述清單種類的屬性。
來源:Base 2.4 §5.2.13.1.20
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13.1.20, 文件頁 281, PDF 頁 307
06 增強格式:分清至少一台與全部控制器
06.01.增強 Log 用 16-byte header 說明版本、查詢種類、CNTLID、SZE、NCFID 與 CFIDS,描述器按 CFI 遞增排列。CNTLID=FFFFh 時清單含至少一台控制器回報的項目;每筆 ACNTL=1 才表示所有控制器都回報這項。
- ACNTL
- All Controllers;1 表示所有控制器回報此項,0 表示至少一台但非全部。
- CFIDS
- Command and Feature Identifier Descriptors Size;增強 Log 每筆描述器占用的 byte 數。
- NCFID
- Number of Command and Feature Identifier Descriptors;增強 Log 中的描述器數量,直接計數。
- CFI
- Command and Feature Identifier;一筆增強描述器中,依 SCP 解讀的操作代碼。
- SZE
- Size;增強 Log 的完整 byte 大小,不是項目數。
來源:Base 2.4 §5.2.13.1.20
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13.1.20, 文件頁 282-283, PDF 頁 308-309
07 完整編碼一次禁止與解除操作
07.01.Lockdown 使用 CDW10 的 CSEL、OFI、IFC、PRHBT、SCP,以及 CDW14 的 CSS/UIDX。PRHBT=1 禁止、0 允許;其他欄位保留原本要作用的種類、介面與控制器集合。重複禁止已禁止項目或允許已允許項目,本身不是錯誤。
- UIDX
- UUID Index;命令帶入的 UUID List 索引,0 不指定 UUID。
來源:Base 2.4 §5.2.16
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.16, 文件頁 405-407, PDF 頁 431-433
08 把設定失敗與命令被禁止分開判斷
08.01.Lockdown 設定本身可因項目不可禁止、介面不支援或控制器選擇無效而失敗。28h 是 Prohibition of Command Execution Not Supported;1Fh 是 Invalid Controller Identifier。已受限制的 Admin 命令則回通用狀態 Command Prohibited by Command and Feature Lockdown。
來源:Base 2.4 §5.2.16
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.16, 文件頁 407-408, PDF 頁 433-434
08.02.受限制的操作從 Admin Queue 收到時,命令以 Command Prohibited by Command and Feature Lockdown 中止;從 Management Endpoint 收到時,回 Access Denied Error Response。
來源:Base 2.4 §8.1.5
來源:NVME-BASE-2.4, Rev. 2.4, §8.1.5, 文件頁 598, PDF 頁 624
09 限制何時消失,要看 CSEL 與持續性設定
| 建立限制時的 CSEL | Lockdown Persistence | 斷電循環後的規則 |
|---|---|---|
| 0:全部控制器 | 已啟用 | 保留,後續 Lockdown 可解除 |
| 0:全部控制器 | 已停用 | 原禁止不跨 power cycle 保留 |
| 1:單一控制器 | 任一狀態 | 不因 LDPE1 而跨 power cycle 保留 |
| 2:指定 primary 的 secondaries | 任一狀態 | 同樣在 power cycle 或後續解除時結束 |
09.01.CSEL=0 的全體限制在 Lockdown Persistence 啟用時跨 power cycle 保留;停用時持續到 subsystem power cycle 或後續解除。CSEL=1、2 的限制持續到 power cycle 或後續解除,不因 LDPE=1 自動取得全體限制的跨斷電保留規則。
- LDPE
- Lockdown Persistence Enable;啟用全體限制跨 power cycle 保留的設定。
來源:Base 2.4 §8.1.5
來源:NVME-BASE-2.4, Rev. 2.4, §8.1.5, 文件頁 598-599, PDF 頁 624-625
09.02.持續性啟用時,未凍結或無認證解凍支援的 Lockdown Persistence Personality,不能透過 Lockdown 禁止 Set Features 或 FID 22h。若任一 personality 支援認證解凍,特定 CDP Authentication 的 Security Send/Receive 必須仍被允許。
- personality
- 規格中的一組裝置配置;本篇只用 Lockdown Persistence 這一種配置及其必要條件。
- CDP
- Configurable Device Personality;將裝置配置分為可查詢、設定或凍結的 personality。
來源:Base 2.4 §5.2.30.1.25.4.1
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.1.25.4.1, 文件頁 494, PDF 頁 520
10 同一廠商 FID 有不同定義時,用 UUID 選版本
10.01.廠商定義 FID 的 Lockdown 在 SCP=2 且相關命令與項目支援 UUID 選擇時,使用 CDW14.UIDX 選 UUID List 項目。LID 14h 對 SCP=2 的廠商 FID 查詢也可使用 UIDX;SCP≠2 時忽略 UIDX。UIDX 是清單索引,不是 FID 或 byte offset。
來源:Base 2.4 §5.2.16
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.16, 文件頁 406-407, PDF 頁 432-433
10.02.UIDX=0 不指定 UUID;非零索引需指向該資訊支援的有效 UUID。全 0、NVMe Invalid UUID 或不支援於該資訊的 UUID 會導向 Invalid Field in Command。
- NVMe
- Non-Volatile Memory Express,主機與非揮發性記憶體子系統之間的介面規範家族。
來源:Base 2.4 §8.1.31.2
來源:NVME-BASE-2.4, Rev. 2.4, §8.1.31.2, 文件頁 737-738, PDF 頁 763-764
接著打開 Spec 看什麼
11.01.以下按概念列出閱讀位置。報告時先用上面的流程說明問題,再打開對應章節看欄位與完整條件。中文教學 HTML 另有本篇全部圖表的逐圖重點、案例與細節。
| 要說明的觀念 | Spec 閱讀位置 |
|---|---|
| 先理解:限制的是哪個操作從哪裡進來 | Base 2.4 §8.1.5 |
| 先查支援層級,再查可禁止項目 | Base 2.4 §8.1.5 |
| 介面與控制器是兩個獨立選擇 | Base 2.4 §5.2.16 |
| 把 LID 14h 的查詢問題寫完整 | Base 2.4 §5.2.13.1.20 |
| 一般格式:一串代碼代表全體共同的項目 | Base 2.4 §5.2.13.1.20 |
| 增強格式:分清至少一台與全部控制器 | Base 2.4 §5.2.13.1.20 |
| 完整編碼一次禁止與解除操作 | Base 2.4 §5.2.16 |
| 把設定失敗與命令被禁止分開判斷 | Base 2.4 §5.2.16 · Base 2.4 §8.1.5 |
| 限制何時消失,要看 CSEL 與持續性設定 | Base 2.4 §8.1.5 · Base 2.4 §5.2.30.1.25.4.1 |
| 同一廠商 FID 有不同定義時,用 UUID 選版本 | Base 2.4 §5.2.16 · Base 2.4 §8.1.31.2 |
學完後想一想
1. LID 14h 可禁止清單含 06h,就代表目前已禁止嗎?
12.01.不代表。先看 SCP 確認它是哪種代碼,CNTTS=0 只表示可禁止。要查目前 Admin Queue 限制,應用同一種類並選 CNTTS=1,再配合正確格式與控制器範圍。
來源
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13.1.20, 文件頁 279-280, PDF 頁 305-306
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13.1.20, 文件頁 281, PDF 頁 307
2. 全體增強清單回 06 00,能說全部控制器都允許 06h 嗎?
12.02.不能。這是一筆已回報的 CFI=06h,ACNTL=0 表示至少一台但非全部符合這次查詢。如果 CNTTS=1,它表示只有部分控制器目前禁止;要找是哪台需用特定 CNTLID 查詢。
來源
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13.1.20, 文件頁 282-283, PDF 頁 308-309
3. 要解除 controller7 的 FID06h 限制,能只送 PRHBT=0 嗎?
12.03.還需保留 SCP=2、OFI=06h、IFC=0、CSEL=1、CSS=7 等相同選擇,並確保執行 Lockdown 的入口仍允許。PRHBT 只決定禁止或允許,不指定對象。
來源
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.16, 文件頁 405-407, PDF 頁 431-433
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.16, 文件頁 406-407, PDF 頁 432-433
4. LDPE=1,是否每個 CSEL 建立的限制都能跨斷電保留?
12.04.不是。跨 power cycle 的 Lockdown Persistence 規則針對 CSEL=0 的全體限制;CSEL=1、2 仍依其在 power cycle 或後續解除時結束的規則。
來源
來源:NVME-BASE-2.4, Rev. 2.4, §8.1.5, 文件頁 598-599, PDF 頁 624-625
5. 增強 Log 第二筆在 byte18,UUID 第二項在 byte64,兩個 2 可以互用嗎?
12.05.不能。CFIDS=2 時增強 Log 第 2 筆從 16+1×2=18 開始;UIDX=2 選 UUID 第 2 項,其 entry 從 64 開始。OT=0 的 Get Log 起點還要 4-byte 對齊,所以讀含 byte18 的資料可從 16 開始。索引和值的位置是不同單位。
來源
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13.1.20, 文件頁 282-283, PDF 頁 308-309
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13.1.20, 文件頁 279-280, PDF 頁 305-306
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.16, 文件頁 406-407, PDF 頁 432-433


Comments