教學 1 · 先知道 Log 是快照還是歷史
想知道目前溫度時,SMART 的現在值比一筆很早的事件有用;想知道剛才是否發生短暫異常時,現在值又不一定足夠。先寫出要回答的問題,再選目前狀態、累計計數或歷史事件。這樣即使讀到的資料不同,也能分辨是觀察時間不同,還是真的互相矛盾。
NVMe · Q1–328
Q69–Q81
Log 回答狀態、歷史或支援能力,但不是每份 Log 都保存歷史,也不是讀取後一定不變。本冊先選對資料與範圍,再處理長度、分段、事件確認與一致性。
每個問題都接著完整解說,依內容帶讀欄位、比較機制或追蹤流程。先看本冊總覽,再沿問題閱讀;必要條件與正常路徑直接顯示。所有數字案例均為教學假設;Status 以 SCT/SC 表示,代碼後的 h 代表十六進位。
先決定要證明什麼,再選 Log;讀成功只代表查詢成功,不代表被查的管理操作已完成。
| 需要的證據 | 查詢對象 | 判讀限制 |
|---|---|---|
| 支援哪些 Log | LID00h | 支援不等於目前有事件 |
| 目前健康 | SMART LID02h | 警告可恢復;累計值則有生命週期 |
| 這次命令的錯誤細節 | Error LID01h | 需對回命令,且舊 entries 可能消失 |
| 持續事件歷史 | PEL LID0Dh | 容量與事件支援限制仍存在 |
舉例看懂:假設一次讀 4096 bytes,NUMD=1023。下一段若採 byte offset,LPO=4096;若 Log 使用 index offset,則要依該 Log 的索引規則前進,不能照抄 4096。
來源:Base 2.4 §5.2.13–5.2.13.1.1 · Base 2.4 §5.2.13.1.3 · Base 2.4 §5.2.13.1.2 · Base 2.4 §5.2.13.1.14–5.2.13.1.14.2.5 (exclude PCIe link/packet decoding)
想知道目前溫度時,SMART 的現在值比一筆很早的事件有用;想知道剛才是否發生短暫異常時,現在值又不一定足夠。先寫出要回答的問題,再選目前狀態、累計計數或歷史事件。這樣即使讀到的資料不同,也能分辨是觀察時間不同,還是真的互相矛盾。
一份 Log 分兩次讀取,不保證兩段來自同一時點。第一段讀完後,如果資料長度或 entries 順序改變,第二段可能接到不同版本。對有 generation 或 context 的 Log,先建立一致的觀察範圍,再分段讀取;沒有這類保證時,必須說明資料可能在讀取期間變動,不能自行宣稱原子快照。
RAE=1 仍然會讀取資料,只是保留相應事件;RAE=0 的成功讀取可能確認事件。假設兩個程式先後讀同一 Log,第一個已確認,第二個看到的通知狀態就可能不同。因此做事件驗證時,要同時保存讀取順序、RAE 與結果,不能只比較最後一份 buffer。
需求:確認能不能讀 Sanitize Status,並判斷可否用 index offset 讀取。以下先找到支援清單的目標項目,再分別讀取功能支援與位移使用方式。
Supported Log Pages 提供查詢目錄,讓 Host 知道目前這個介面支援哪些 LID,以及各 LID 是否允許用 entry 索引讀取。它能避免把不支援誤認為資料為零;不過,先讀它是探索方法,不是每次 Get Log Page 前都必須重送的命令。
回覆屬於收到命令的介面與 controller。不同介面可能支援不同 Log;CC.CSS=110b 時,CSI 與已啟用的 Command Set Profile 也會影響結果,不能把另一個介面的清單直接當成本介面的能力。
Get Log Page 使用 LID=00h。Identify.LPA.MLPS=1 保證提供 Supported Log Pages;MLPS=0 仍可能提供,不能直接判成所有 Log 都不支援。LPA.LPEDS(Figure338 bit2)說明延伸 offset 與長度能力;目標 entry 的 LSUPP、IOS 則分別表示該 LID 是否支援及是否接受 index offset。
教學假設:同一 PCIe Admin 介面,CC.CSS=000b、UUID Index=0,LPA.MLPS=1、LPEDS=1。此處要查的是 Sanitize Status 的 LID81h,不是 Sanitize Namespace 的 Opcode8Ch。
| 查詢步驟與原文位置 | 要取出的資訊 | 這一步能判斷什麼 |
|---|---|---|
| 1 · §5.2.13.1.1、Figure 210,文件頁 217/PDF 243 | Get Log Page:LID=00h、NSID=0、NUMDL=00FFh、NUMDU=0、LPO=0、OT=0、RAE=0。 | 讀取 256 筆、每筆 4 bytes,共 1024 bytes 的支援清單;查詢成功不表示 256 個 LID 全部受支援。 |
| 2 · Figure 210,文件頁 217/PDF 243 | 目標 LID=81h=129;entry 位於 4×129=516=204h,取 bytes516~519。 | 用 LID 當索引。Opcode 與 FID 即使同為 81h,也不是這張清單要查的對象。 |
| 3 · Figure 211,文件頁 217~218/PDF 243~244 | 假設 entry=00000001h:bit0 LSUPP=1,bit1 IOS=0。 | 支援 Sanitize Status,但不支援該 Log 的 index offset。LPEDS=1 只提供一般延伸讀取能力,不能推翻 IOS=0。 |
| 4 · Figures 206、312,文件頁 214、313 起/PDF 240、339 起 | 後續讀 LID81h 時使用 OT=0,依目標 scope 選 NSID;再解讀回傳的 Sanitize Status。 | LSUPP 只回答 Log 是否提供;清除是否進行或完成,要看後續 Status 內容。即使 LSUPP=1,強行使用不支援的 OT=1 仍須回 Invalid Field。 |
如果 Supported Log Pages 本身不可取得,不能把缺少清單當成所有 LID 都不支援;應改查該 Log 在規格中的支援條件及對應 Identify 欄位。任何查詢失敗後留下的 buffer,都不能拿來解讀 LSUPP。
來源:Base 2.4 §5.2.13–5.2.13.1.1 · Base 2.4 §5.2.14.2.1 · Base 2.4 §5.2.13.1.38
整張表有 256 個 4-byte entries。LID=n 的 entry 位於 4×n;bit0 是 LSUPP,bit1 是 IOS,高位 LIDSP 另依該 Log 定義。LSUPP=0 時,Host 應忽略其餘欄位。
先選對 controller 與命令集,讀取 00h,再找到目標 LID 的 entry。確認支援後,才依該 Log 的 scope、長度及參數讀取內容;能力在韌體或配置變更後需要重新確認。
成功取得的是能力表,不是各 Log 的內容。例如 LID=81h 的 LSUPP=1,只能證明可以查 Sanitize Status,不能據此宣稱已執行或完成 Sanitize。
不支援的 LID 一般回 Invalid Log Page(1/09h);若 LSUPP=1,卻使用不支援的 OT=1,回 Invalid Field(0/02h)。兩者分別是 Log 不支援與讀取方式非法。
將 LSUPP、IOS、LPA 與實際合法查詢一起比較。不能要求所有支援的 Log 都支援 index offset,也不能用一次非法參數失敗推翻 LSUPP。
先確認清單與後續命令來自同一介面、相同 CSI 及設定期間,再檢查目標 entry 是否按 4 bytes 定位。
來源:Base 2.4 §5.2.13–5.2.13.1.1 · Base 2.4 §5.2.14.2.1 · Base 2.4 §5.2.30.1.18 · Base 2.4 §3.7.1–3.7.4 · Base 2.4 §4.2.3 · Base 2.4 §5.2.13.1.2 · Base 2.4 §5.2.2 · Base 2.4 §5.2.13.1.14 (header, reset, hardware, Set Feature events) · Base 2.4 §5.2.13.1.38
Error Information 用來追查某次錯誤的細節;SMART / Health 則提供目前警告及生命週期累計資訊。前者回答哪筆命令或哪個錯誤,後者回答目前健康狀態與長期使用情況,不能互相替代。
LID01h 是 controller 的錯誤紀錄。LID02h 可依支援情況接受 namespace 查詢,但 Base 2.4 明確指出本版沒有 namespace-specific SMART 欄位,因此兩種回覆包含相同資訊,不能自行標成各 namespace 的獨立使用量。
01h 每筆 64 bytes,重點是 ECNT、SQID、CID、Status、參數錯誤位置與 NSID。02h 為 512 bytes,重點是 Critical Warning、溫度、spare、Percentage Used,以及資料量、命令、時間和錯誤累計。
ELPE+1 表示最多可讀多少個 Error Information entries;LPA 的 SMART 支援位決定是否接受 per-namespace 請求。先確認支援,再解讀 Log 內容。
遇到錯誤時先保存 CQE,接著讀 01h 對回命令,再以同時段 02h 觀察健康狀態。先記錄取樣時間,避免將很久以前的錯誤與目前警告錯配。
成功讀取不代表裝置沒有錯誤。ECNT=0 表示該 entry 無效;Percentage Used=100 表示估計耐久度已耗用,並不直接表示裝置已失效。
不支援 per-namespace SMART 卻指定一般 NSID,須回 Invalid Field(0/02h)。Log 中的舊錯誤 Status 是紀錄內容,與本次 Get Log Page 的完成 Status 不同。
SMART 的 Error Log Entries 累計不等於目前 01h buffer 裡的有效筆數;有限容量與重設清除可能讓歷史總量大於現存 entries。
來源:Base 2.4 §5.2.13–5.2.13.1.1 · Base 2.4 §5.2.13.1.2 · Base 2.4 §5.2.13.1.3 · Base 2.4 §3.7.1–3.7.4 · Base 2.4 §4.2.3 · Base 2.4 §5.2.2 · Base 2.4 §5.2.13.1.14 (header, reset, hardware, Set Feature events)
這三張 Log 分別回答韌體從哪個 slot 執行、哪些 namespace 發生過變更,以及命令受不受支援、可能造成什麼影響。它們不是通用的操作歷史清單。
03h 的資料依 multi-domain 能力屬於 domain 或 subsystem;04h 描述此 controller 的 attached namespace 變更;05h 的命令支援則以接收命令的 controller 與命令集為準。
03h 讀 CAFS、NAFS 與 FRS1~7;04h 讀 NSID 清單及首筆 FFFFFFFFh 的溢位標記;05h 讀各 Opcode 的 CSUPP、effects、CSE/CSER 與 CSP。
先查 00h 支援表及相關 Identify 能力。Firmware 的 slot 數與唯讀限制由 Identify.FRMW 提供,不能只靠 03h 中非零字串的數量推算。
先根據問題選 Log:更新韌體後比較 03h 與 Identify.FR;收到 namespace 通知後讀 04h,再查 Identify;執行管理命令前讀 05h,完成後重查可能被改變的能力。
例如 NAFS=2 只表示 slot 2 等待適用的 CLR 啟用,不表示目前已從 slot 2 執行。04h 出現 NSID=7 也只指出有變更,不能單憑清單判斷它被 Format 或刪除。
各次 Get 的錯誤與 Log 所描述的事件分開。不存在支援的 LID 回 1/09h;非法已定義參數依 Get 規則回 0/02h,不能把空 slot 或空變更清單本身當成失敗。
核對 active slot 與 FR、變更清單與新的 Identify,以及 CSUPP 與合法命令行為。每一組對照有不同目的,不要求三張 Log 的數值彼此相同。
來源:Base 2.4 §5.2.13.1.4 · Base 2.4 §5.2.13.1.5 · Base 2.4 §5.2.13.1.6 · Base 2.4 §3.7.1–3.7.4 · Base 2.4 §4.2.3 · Base 2.4 §5.2.13.1.2 · Base 2.4 §5.2.2 · Base 2.4 §5.2.13.1.14 (header, reset, hardware, Set Feature events)
Self-test Log 用來看測試進度與最近結果;PEL 用來追查跨時間的特定事件;Sanitize Status 用來判斷清除操作的目前狀態及最後結果。先選對證據種類,才不會把命令接受當成工作完成。
Self-test scope 受 DSTO.SDSO 等能力影響;PEL 屬於 subsystem;81h 的 NSID 則用來区分 subsystem 與 namespace sanitization target。查詢的 controller 不一定就是事件影響的全部範圍。
06h 先讀 DSTOS,再解釋進度與結果有效位;0Dh 先建立或取得 reporting context,再依事件長度走訪;81h 先看 SSTAT,再使用 SPROG 及相關結果欄位。
讀 OACS 的 Self-test 能力、LPA 的 PEL 能力,以及 SANICAP/namespace Sanitize 能力,再確認 LID06h、0Dh、81h 受支援。Log 可讀不代表任意操作方法都可用。
例如 Sanitize 命令完成後,持續查 81h 判斷背景操作;Self-test 結束後讀 06h 最新有效結果;要追查先前重設或管理操作,才到 PEL 找支援的事件。
Get 成功表示讀取成功,不表示 Self-test 通過或 Sanitize 成功。PEL 沒有某筆事件,也要先確認事件支援、記錄條件與保存範圍。
不支援的 LID 回 1/09h;PEL context 順序錯誤可能回 Command Sequence Error(0/0Ch)。操作本身失敗要看其專用 Log 狀態,不能替本次成功 Get 改成失敗 CQE。
以操作目標、時間及最新結果交叉比對。不得將舊 Self-test 結果或上次 Sanitize 成功,當成目前這次作業已成功的證據。
來源:Base 2.4 §5.2.13.1.7 · Base 2.4 §5.2.13.1.14 (header, reset, hardware, Set Feature events) · Base 2.4 §5.2.13–5.2.13.1.1 · Base 2.4 §3.7.1–3.7.4 · Base 2.4 §4.2.3 · Base 2.4 §5.2.13.1.2 · Base 2.4 §5.2.2
這些 Log 分別描述群組耐久度、可預測延遲狀態、禁止操作清單、開機分割區狀態,以及媒體單元資源。目的不同,不能把它們統稱為健康資訊後使用相同欄位判讀。
先辨認管理對象:Endurance Group 使用 ENDGID,Predictable Latency 針對 NVM Set;Lockdown 依選擇與支援範圍,Boot Partition 透過 controller 查詢,Media Unit 則反映 domain 或 subsystem 資源。
09h 看警告、spare 與壽命計數;0Ah/0Bh 看 Set 的 latency 狀態及事件集合;14h 看禁止的 Opcode/FID;15h 看分割區識別與保護狀態;10h 看 Media Unit 識別、歸屬及狀態。
先查 00h 及相關 Identify 能力。主要 LID 為 09h、0Ah/0Bh、14h、15h、10h;同一個 LSI 在不同 LID 的意義可能不同。
由待回答的問題選 LID,再由 Identify 建立資源 ID 的對應,最後依該 Log 的參數與結構解碼。例如要查 group 3 的健康狀態,LSI 應選 ENDGID=3,而不是隨手填 NSID。
成功回覆只描述選定對象。例如一個 group 的警告不能推論成全部 namespace 都有相同媒體故障;Lockdown 列出禁止項目,也不是那些命令的執行歷史。
不支援的 LID 與非法資源選擇須分開處理。前者是 1/09h;後者依該 Log 的已定義參數與專用 Status 判斷,不能一律改成 Invalid Namespace。
核對資源歸屬、Log 狀態及實際功能。例如被禁止的 FID,應與 Lockdown 設定一致;Media Unit 狀態則要連同 namespace 所依賴的資源判斷。
來源:Base 2.4 §5.2.13–5.2.13.1.1 · Base 2.4 §5.2.14.2.1 · Base 2.4 §3.7.1–3.7.4 · Base 2.4 §4.2.3 · Base 2.4 §5.2.13.1.2 · Base 2.4 §5.2.2 · Base 2.4 §5.2.13.1.14 (header, reset, hardware, Set Feature events)
scope 決定資料描述哪個物件;選擇欄位則指出這次要查哪個實例。NSID 出現在公共命令格式中,不表示每張 Log 都可以查任意 namespace。
Figure 209 列出 controller、namespace、domain、subsystem 等範圍,但個別欄位也可能有更具體的定義。讀完整張表後,仍要核對該 LID 的例外。
用 LSUPP 確認 Log 支援,再查 LPA、multi-domain 能力,以及該 LID 是否使用 CSI 或 UUID 選擇。這些能力決定哪些查詢組合有效。
controller 或 subsystem scope 的 Log,一般使用 NSID=0 或 FFFFFFFFh;LSI、LSP、CSI 與 UIDX 各有獨立用途。不能把 LSI 當成 NSID 的延伸位元。
先寫出要查的物件,例如某 controller、ENDGID=3 或某 sanitization target,再把它映射到正確欄位。其餘未定義欄位依 Reserved 規則填寫。
合法查詢回傳所選範圍的資料。例如 aggregate SMART 與某 group 的耐久度是不同範圍,不能複製同一份資料後標成每個 namespace 的獨立統計。
依共同規則,controller 或 subsystem scope 的 Log 若指定 0/FFFFFFFFh 以外的 NSID,須回 Invalid Field(0/02h)。其他 scope 則按各 LID 與 NSID 規則處理。
將命令中的選擇欄位、Identify 的資源對應與回傳內容一起保存,才能確定比較的是同一物件。
先查該 LID 的 scope,而不是看到 NSID 非零就認定回覆是 namespace 專屬資料。
來源:Base 2.4 §5.2.13–5.2.13.1.1 · Base 2.4 §5.2.13.1.3 · Base 2.4 §8.1.31.1–8.1.31.2 · Base 2.4 §3.7.1–3.7.4 · Base 2.4 §4.2.3 · Base 2.4 §5.2.13.1.2 · Base 2.4 §5.2.2 · Base 2.4 §5.2.13.1.14 (header, reset, hardware, Set Feature events)
分段讀取讓 Host 用有限 buffer 取得大型 Log,但必須同時保證位址連續及內容一致。每段 Get 都成功,只能證明各段傳輸成功,不能自動證明合併檔完整。
Offset 是 Log 內的位置,不是 Host buffer 位址。OT=0 使用 byte offset;OT=1 使用該 Log 定義的 entry index,兩種單位不能混算。
LPA.LPEDS 確認延伸長度與 offset,目標 LID 的 IOS 確認 index offset;另依 MDTS 與此 Log 的長度規則選擇每次傳輸量。
NUMD=(NUMDU<<16)|NUMDL,通常傳輸 bytes=4×(NUMD+1)。LPOU/LPOL 組成 64-bit offset;byte offset 要 Dword 對齊。某些 Log 另有 entry 或 header 規則。
成功後應取得預定範圍。若要求長度超過 Log 尾端,除另有規定外,超出部分的結果未定義;不能把那些 bytes 當成 Log 的延伸資料。
教學假設:以 OT=0 讀取 8192 bytes 的 Log,每次傳輸 4096 bytes。
這一段對應 Log 的 bytes 0~4095;保存查詢目標、回覆與取樣資訊。
這一段對應 Log 的 bytes 4096~8191,接在前一段後面,沒有缺口。
重疊 bytes 可用來比對;若兩次讀取期間內容變更,不能任意挑一份覆蓋另一份。
完整覆蓋 8192 bytes 只證明沒有漏段。各段是否屬於同一份資料,仍要依目標 Log 的 generation 或 context 機制確認。
Offset 大於 Log 大小,或不支援 IOS 卻使用 OT=1,須回 0/02h。byte offset 低兩位非零時,controller 可回 0/02h,也可依低兩位為零處理;不能把這個允許選擇寫成唯一錯誤結果。
核對總長度、各段 offset/NUMD、generation 或 reporting context。涵蓋完整與同一份快照,是兩個都要成立的條件。
來源:Base 2.4 §5.2.13–5.2.13.1.1 · Base 2.4 §5.2.13.1.8–5.2.13.1.9 · Base 2.4 §3.7.1–3.7.4 · Base 2.4 §4.2.3 · Base 2.4 §5.2.13.1.2 · Base 2.4 §5.2.2 · Base 2.4 §5.2.13.1.14 (header, reset, hardware, Set Feature events)
這三個欄位分別選資源、選資料定義,以及決定讀取後是否保留事件。它們控制不同部分,不能因為都叫參數就互相替代。
LSI 的意義由 LID 決定;UIDX 從 UUID List 選擇適用定義;RAE 則影響這次讀取所對應的非同步事件。不是所有 Log 都使用三者。
先看該 LID 是否定義 LSI,以及 Get Log Page 是否支援 UUID 選擇。RAE 是否有實際作用,則要看該事件如何確認與清除。
LSI 在 CDW11 bits31:16;UIDX 在 CDW14 bits6:0,0 表示不指定 UUID;RAE 在 CDW10 bit15。UIDX 是索引,不是 UUID 的數值本體。
先固定目標與 UUID 定義,再決定是否要保留事件以繼續取樣。若需要分段讀取與事後確認,保存每次 RAE,並遵守該 Log 的特定確認方式。
RAE=1 的成功讀取保留對應事件;RAE=0 的成功讀取依規則清除。若命令未成功,事件必須保留,不能因 Host 已嘗試讀取就視為確認。
非法 UUID 選擇依 §8.1.31 回 Invalid Field(0/02h);LSI 非法則按該 LID 定義處理。不能用改 RAE 的方式修正錯誤的資源 ID。
核對 LSI 的目標、UIDX 對應資料及事件是否仍 pending。讀取相同 bytes 但 RAE 不同,後續通知行為可能不同。
來源:Base 2.4 §5.2.13–5.2.13.1.1 · Base 2.4 §8.1.31.1–8.1.31.2 · Base 2.4 §5.2.2 · Base 2.4 §3.7.1–3.7.4 · Base 2.4 §4.2.3 · Base 2.4 §5.2.13.1.2 · Base 2.4 §5.2.13.1.14 (header, reset, hardware, Set Feature events)
這題要防止把不同時點的資料拼成一份看似完整的報告。長度正確、沒有缺口,仍不代表所有欄位屬於同一次擷取。
一致性判斷由各 Log 提供的機制決定。Telemetry 有 generation,PEL 有 reporting context;沒有此類機制的動態 Log,不能自行假設跨命令原子快照。
先確認支援的 Log 結構與版本,再找 generation、總長度、可用狀態或 context action。不能只查看 Get Log Page 的公共欄位。
Telemetry 記錄 TCDGN/相關 generation 及資料區邊界;PEL 記錄 context、TLL、事件長度與版本。每段同時保存 offset、length 及取得時間。
先看 generation 或 context 是否在整段讀取期間保持一致,再檢查解析器。
先取得 header,再按同一擷取或 context 讀取;必要時重讀 header。若前後 generation 改變,應重新取得一致資料,或明確標示無法證明一致,不能只換掉最後一份 header。
例如最初 TCDGN=10、最後=11,兩次 Get 都成功仍不足以證明中間所有 chunks 來自第 10 代。成功的分析結果必須連同一致性證據保存。
內容改變不一定產生錯誤 CQE;動態更新本身可以合法。PEL 的非法 context 操作則可能得到 0/0Ch,應和資料版本改變分開判斷。
將 header、每段資料及查詢順序當成一組證據,不能拿最後讀到的 capability 或 generation 回頭替所有舊 chunks 背書。
來源:Base 2.4 §5.2.13–5.2.13.1.1 · Base 2.4 §5.2.13.1.8–5.2.13.1.9 · Base 2.4 §5.2.13.1.14 (header, reset, hardware, Set Feature events) · Base 2.4 §3.7.1–3.7.4 · Base 2.4 §4.2.3 · Base 2.4 §5.2.13.1.2 · Base 2.4 §5.2.2
有限容量的 Log 不可能無限保存歷史,因此必須分清楚累計事件數與目前還能讀到的紀錄。缺少舊 entry 不一定表示事件從未發生。
Error Information 以 controller 為範圍;PEL 保存 subsystem 的支援事件,並透過 reporting context 提供報告。兩者的容量與讀取生命週期不同。
Error entries 依新到舊排列,ECNT 識別每次錯誤。PEL 依 event header 的 EHL、EL、ET、ETR 走訪,不能假設每筆固定 64 bytes。
Error Information 的容量由 ELPE+1 決定;PEL 先看支援能力、報告 TLL、事件數與最大容量資訊。不能把 SMART 累計值當成目前 buffer 的長度。
取樣時記錄有效 entries 與首尾識別,再於後次取樣找重疊範圍。若最舊紀錄已不在可讀範圍,標示歷史缺口,不能補造它的內容或順序。
Error Log 已滿又新增 entry 時,規範建議插入新 entry 並丟棄最舊 entry。PEL 是有限的持續歷史,讀完整份報告也不等於讀到裝置全部生命週期事件。
容量用完不會使合法 Get 自動回失敗;應檢查回覆內容與各 Log 的保存規則。只有查詢參數或 context 不合法時,才依相應 Status 處理。
ECNT/SMART 的累計變化與目前筆數可能不同;應以容量及保留規則解釋,不能要求每次取樣都仍含所有舊紀錄。
來源:Base 2.4 §5.2.13.1.2 · Base 2.4 §5.2.13.1.14 (header, reset, hardware, Set Feature events) · Base 2.4 §3.7.1–3.7.4 · Base 2.4 §4.2.3 · Base 2.4 §5.2.2
判斷保留性時,要把查詢命令、暫時回報狀態與真正保存的歷史分開。重設使 Get 中止,不表示它原本要讀的所有資料都被清除。
保留規則可能適用整張 Log,也可能只適用其中某個欄位。多 controller 或 multi-domain 配置還要先確認重設影響哪些範圍。
讀各 Log 的保留敘述與 Reset 章節。Figure 209 的 Restore to Default Content 指製造預設內容的恢復,並不是「遇到任何 Reset 就清空」的能力位。
典型比較是 Error Information entries、其 ECNT、SMART 累計值、即時溫度、PEL 事件及 PEL context。這六種資訊即使相鄰,也不能套用同一保留結論。
先取得同一對象的前置快照,執行指定重設,恢復查詢後再讀。記錄中間是否同時發生 Firmware Activation、Format 或出廠配置恢復,避免把多個原因混成一個。
Error entries 在 CLR 與 Power Cycle 後建議清除,但 ECNT 持續;SMART 生命週期資訊原則上跨 Power Cycle 保留,個別欄位另有例外;PEL 事件的持續性不能套到 reporting context。
| 觸發方式 | 這項操作或狀態會如何變化 |
|---|---|
| Controller Reset 後是否保留或繼續? | Controller Reset 會中止未完成的查詢,Host 恢復 Admin Queue 後重新讀取。Log 內容是否保留則是另一個問題:Error Information entries 建議清除,但 Error Count 保留;SMART 的累計資訊與 PEL 依各欄位規則持續,不能隨查詢一起當成遺失。 |
| NVM Subsystem Reset 後是否保留或繼續? | NVM Subsystem Reset 後,先恢復受影響 controller 的查詢通道,再讀取 Log。它不等於恢復出廠設定;Figure 209 的 Restore to Default Content 欄描述製造預設內容的恢復,不能拿來當一般 Reset 的保留表。 |
| Power Cycle 後是否保留或繼續? | Power Cycle 後重新提交查詢。SMART 的生命週期資訊及 PEL 具有跨斷電的保留規則;Error Information entries 則建議清除,但其累計 Error Count 仍保留。目前溫度、正在執行的操作及回報 context 必須依各自定義重新判讀,不能把所有 bytes 當成固定不變。 |
比較前後值本身沒有新的 Status。如果恢復後 Get 失敗,先檢查 controller 是否 Ready、選擇欄位與 context 是否有效,不能將查詢失敗解釋成內容已被清零。
以欄位的有效條件與單位比較,而不是要求整個 buffer 完全相同。累計保留與目前狀態重新取樣可以同時成立。
先確認是在比較內容保留,還是在比較一個已失效的 context 或未完成查詢。
來源:Base 2.4 §5.2.13–5.2.13.1.1 · Base 2.4 §5.2.13.1.2 · Base 2.4 §5.2.13.1.3 · Base 2.4 §5.2.13.1.14 (header, reset, hardware, Set Feature events) · Base 2.4 §3.7.1–3.7.4 · Base 2.4 §4.2.3 · Base 2.4 §5.2.2
這題要建立可重現的能力一致性檢查。宣告支援只表示存在合法用法,不能把任何參數下的失敗都判為能力造假。
固定接收介面、controller、CSI、UUID 選擇及配置時間。尤其 CC.CSS=110b 時,尚未啟用的命令集會被視為不支援。
一起保存 LSUPP、IOS、CSUPP、Identify 的功能位與 FID19h 設定。不要拿 LID 的支援位去判斷任意 Opcode,也不要反過來混用。
測試命令保留 LID 或 Opcode、NSID、CSI、LSP、LSI、OT、長度及資料指標。取得 CQE 後再讀 SCT/SC,而不是只記一個工具錯誤訊息。
先確認兩份證據來自同一介面與同一命令集配置,這通常比先懷疑韌體更能排除誤判。
先構造符合能力、scope 及狀態的合法命令,再執行並核對結果。若失敗,逐項排除非法參數、被 Lockdown 禁止、namespace 未就緒及配置變更。
在同一穩定配置下,明確宣告支援卻對合法請求回不支援,才形成需要追查的矛盾;合法的限制性 Status 不能直接當成不支援。
Get 不支援 LID 使用 1/09h;不支援 Opcode 使用 0/01h;0/02h 通常需要回頭檢查參數。保留規範的專用例外與多重錯誤選擇,不能只比一個預期數字。
比較內容、行為與時間關係三者。若韌體已啟用新版本,應先重讀宣告,不能用舊表要求新 controller 行為。
來源:Base 2.4 §5.2.13–5.2.13.1.1 · Base 2.4 §5.2.13.1.6 · Base 2.4 §5.2.14.2.1 · Base 2.4 §5.2.30.1.18 · Base 2.4 §3.7.1–3.7.4 · Base 2.4 §4.2.3 · Base 2.4 §5.2.13.1.2 · Base 2.4 §5.2.2 · Base 2.4 §5.2.13.1.14 (header, reset, hardware, Set Feature events)
這張表讓 Host 在執行命令前,了解是否支援,以及操作可能改變資料、namespace 配置或 controller 能力。它描述可能效果,不是每次執行一定發生的全部效果。
Admin Opcode 與 I/O Opcode 使用不同區域;I/O 區還要選對命令集。CSP 可以同時表示多種 scope,因為實際參數可能決定不同影響對象。
先讀 Identify Controller 的 LPA.CSES(Figure338 bit1),確認是否提供 LID05h,再固定命令集與 UUID 選擇。這個位元只表示能力 Log 可讀,Log 裡各 Opcode 是否受支援仍要逐筆查 CSUPP。CSP=0 則表示未回報 scope,不能解成「不影響任何物件」。
Figure216 先決定 entry 位置:Admin 使用 4×Opcode,I/O 使用 1024+4×Opcode,單位都是 bytes。Figure217 再定義這 4 bytes 中的 CSUPP、LBCC、NCC、NIC、CCC、CSE、CSER、USS 及 CSP。例如 Admin Opcode02h 是 Get Log Page,NVM I/O Opcode02h 卻是 Read;即使編碼相同,也不能查同一筆 entry。
先找到正確 entry,再依 CSE/CSER 的建議協調其他工作。Host 支援非零 CSER 值時,使用其放寬建議;不支援時回到 CSE。命令完成後,重新查詢可能改變的能力或清單。
例如 NIC=1 表示命令可能改變 namespace 數量或多個 namespace 的能力,不表示這次呼叫一定新增一個 namespace。CSUPP=0 時,其餘 entry 欄位須為零。
讀表失敗依 Get Log Page 處理;實際命令失敗則依該命令 Status。CSE 的建議不能任意提高成一個固定的強制錯誤碼。
將 effects 與操作前後 Identify、清單及使用者資料影響交叉比對。CSUPP 與 Identify 宣告應一致,但實際效果仍須依本次參數判斷。
先確認 Admin 或 I/O 區,再核對 Opcode、byte offset 與成功的查詢 CQE。Log 中資料的起點、分段 buffer 的起點,以及 entry 內的 bit 位置是三種座標;把任一種誤當另一種,都可能讀到別的命令或欄位。
來源:Base 2.4 §5.2.13.1.6 · Base 2.4 §5.2.14.2.1 · Base 2.4 §5.2.30.1.18 · Base 2.4 §3.7.1–3.7.4 · Base 2.4 §4.2.3 · Base 2.4 §5.2.13.1.2 · Base 2.4 §5.2.2 · Base 2.4 §5.2.13.1.14 (header, reset, hardware, Set Feature events) · Base 2.4 §3.1.3.4 (Figure 28 PCIe I/O-controller rows and O/M/P note only)
來源:Base 2.4 §5.2.13.1.6 · Base 2.4 §5.2.14.2.1 · Base 2.4 §5.2.30.1.18 · Base 2.4 §3.7.1–3.7.4 · Base 2.4 §4.2.3 · Base 2.4 §5.2.13.1.2 · Base 2.4 §5.2.2 · Base 2.4 §5.2.13.1.14 (header, reset, hardware, Set Feature events) · Base 2.4 §3.1.3.4 (Figure 28 PCIe I/O-controller rows and O/M/P note only)
Base 的文件頁碼等於 PDF 頁碼減 26;NVM 與 PCIe 兩份規格的文件頁碼則與 PDF 頁碼相同。以下依提供的 PDF 本文列出章節、頁碼及 Figure 編號。若同一頁包含其他主題,只引用本題需要的定義,不納入 Fabrics 或 PCIe Link、封包內容。
以下連結可開啟對應的圖表教學,查閱欄位及判讀方式。每張圖保留固定的教學位置,方便之後反覆查詢。
NVM-Express-Base-Specification-Revision-2.4-Ratified-2026.07.31.pdfNVM-Express-NVM-Command-Set-Specification-Revision-1.3-Ratified-2026.07.31.pdfNVM-Express-NVMe-over-PCIe-Transport-Specification-Revision-1.4-Ratified-2026.07.31.pdf