NVMe Command and Feature Lockdown:查詢、限制範圍與持續性

12 minute read

English

00.01.Command and Feature Lockdown 處理的是「哪些管理操作,在什麼入口、哪些控制器上不准執行」。理解它需要把能力、目前狀態與修改命令接起來,再分清限制何時解除、斷電後是否保留。本文以一個 FID 的限制與讀回為例,從全貌走到命令欄位、兩種 Log 格式與必要的持續性例外。

Lockdown
本篇指 Command and Feature Lockdown:以操作種類、接收介面與控制器範圍限制管理操作的機制。
FID
Feature Identifier;指定要讀取或設定哪一項 Feature 的編號。

這篇的主軸

01

先知道能限制什麼

01-01先查裝置是否支援整體限制或逐一指定控制器,再查哪些操作允許被禁止。功能存在、操作受支援、操作可禁止,是三個不同問題。

02

把限制範圍說清楚

02-01依序選操作、接收入口與控制器。只禁止一項設定、只限制某個入口,或只選某台控制器,會得到不同的影響範圍。

03

查詢要能驗證設定

03-01一般格式看全體共同項目;增強格式看指定控制器或全體彙整,再分辨某項是否所有控制器都符合。用相同條件讀回才有比較意義。

04

理解限制的生命週期

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 先理解:限制的是哪個操作從哪裡進來

從意圖到可確認的限制
  1. 先說清楚:要限制哪個操作、接收介面與控制器集合。
  2. Identify 查 CFLS/CCFLS,再讀 LID14h 的可禁止清單。
  3. Lockdown 填 SCP、OFI、IFC、CSEL/CSS、PRHBT,等完成。
  4. 用相同範圍讀 LID14h 的目前禁止清單,確認設定結果。
  5. 後續符合條件的命令被拒絕;解除與 power cycle 另依持續性規則判斷。
查詢取得資訊;Lockdown 改變狀態;後續命令才接受限制檢查。來源:Base §8.1.5、§5.2.16。
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 QueueCSEL0全部控制器
FID06h、Admin QueueCSEL1、CSS7控制器 7
FID06h、Admin QueueCSEL2、CSS7primary7 所屬 secondaries,非 primary7 本身
FID06h、controller7IFC 由 0 改 2從 Admin Queue 改為 Management Endpoint
每列假設相關能力與入口均受支援;這些選擇分別管控制器集合與接收入口。來源:Base Figures365、366。

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 一般格式:一串代碼代表全體共同的項目

把 6 個 bytes 分成 header 與有效清單
byte offset範例值如何解讀
012hCS1:Admin 已禁止;SS2:FID
1~200 00保留,不是清單內容
302hLNGTH=2,直接計數
4~506 072 筆 FID:06h、07h
6~511保留不解析為其他 FID
索引 0、offset4、FID06h 是第幾筆、存在哪、代表什麼的三種答案。來源:Base Figure276。
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 增強格式:分清至少一台與全部控制器

A/B 的禁止狀態,如何變成兩種 Log固定查 SCP2、CNTTS1;假設 subsystem 只有 A、B。全體增強清單保留 06h 的部分控制器資訊,一般格式只留下全體共同的 07h。來源:Base Figures276~278。控制器 A 目前禁止FID 06h, 07h控制器 B 目前禁止FID 07h相同 SCP/CNTTS,改變回覆格式一般 ELPF0LNGTH=1 → 07hELPF1 / CNTLID=FFFFh06h: ACNTL007h: ACNTL1
固定查 SCP2、CNTTS1;假設 subsystem 只有 A、B。全體增強清單保留 06h 的部分控制器資訊,一般格式只留下全體共同的 07h。來源:Base Figures276~278。

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 完整編碼一次禁止與解除操作

同一目標:禁止與允許只差 bit4假設功能、controller7 與 FID06h 均符合條件,且 Lockdown 入口可執行。低位 SCP2 選 FID;高位 CSEL1 仍需 CDW14 的 CSS7 提供實際編號。來源:Base Figures365、366。OPC=24h · CSEL1 · OFI06h · IFC0 · SCP2CSS7 → CDW14=00070000hPRHBT=1禁止:00010612hPRHBT=0允許:00010602h每次成功後,按相同目標讀回 LID14h
假設功能、controller7 與 FID06h 均符合條件,且 Lockdown 入口可執行。低位 SCP2 選 FID;高位 CSEL1 仍需 CDW14 的 CSS7 提供實際編號。來源:Base Figures365、366。

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 與持續性設定

一個 subsystem power cycle 之後,哪些限制保留?
建立限制時的 CSELLockdown Persistence斷電循環後的規則
0:全部控制器已啟用保留,後續 Lockdown 可解除
0:全部控制器已停用原禁止不跨 power cycle 保留
1:單一控制器任一狀態不因 LDPE1 而跨 power cycle 保留
2:指定 primary 的 secondaries任一狀態同樣在 power cycle 或後續解除時結束
比較的是 power cycle;不能把一般 Controller Reset 代入這一欄。凍結與認證例外則在正文另行說明其條件。來源:Base §8.1.5。

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

採用的規格版本

NVM Express Base Specification, Revision 2.4

Jia-Chang

Jia-Chang

Human

Comments

  Write a comment ...