NVMe 自問自答題庫:Controller 初始化與停用
NVMe · Q1–328
Q1–Q9
Controller 初始化與停用
先理解 controller 如何從停用轉為就緒,再開始處理命令。讀到能力,不表示 controller 已啟用;Host 設定 EN,也還要等待 RDY。即使 RDY=1,仍可能需要依 Ready Mode 確認媒體是否可用。本冊將狀態、等待時間及允許執行的動作放在一起,說明每個階段應如何判斷。
每個問題都接著完整解說,依內容帶讀欄位、比較機制或追蹤流程。先看本冊總覽,再沿問題閱讀;必要條件與正常路徑直接顯示。所有數字案例均為教學假設;Status 以 SCT/SC 表示,代碼後的 h 代表十六進位。
- SCT
- Status Code Type,完成狀態代碼類型
從未啟用到能送命令
重新啟用前,先確認上一輪停用已完成。啟用與停用都要觀察 RDY 的實際變化,不能只看 Host 自己寫入的 EN。
| 階段 | 觀察/動作 | 下一步的條件 |
|---|---|---|
| 停用完成 | CC.EN=0;CSTS.RDY=0 | 設定 AQA、ASQ、ACQ 與 CC |
| 啟用中 | Host 將 EN 從 0 設為 1,並開始計時 | 等待 RDY=1,同時檢查 CFS 及適用的 timeout |
| 介面就緒 | RDY=1;依 Ready Mode 判斷媒體限制 | 先執行允許的 Admin 命令,再建立 I/O queue |
| 再次停用 | Host 將 EN 從 1 清為 0,並停止提交新命令 | 等待 RDY=0,才開始下一次初始化 |
舉例看懂:假設 CAP.TO=4,停用等待上限為 4×500 ms=2 s。這個期限用來等待 controller 停用,不是每筆 I/O 命令的 timeout。啟用時還須根據 CAP.CRMS、所選 Ready Mode 及 CRTO 決定期限,因此不能將這個 2 s 套用到所有等待情況。
來源:Base 2.4 §3.1.4 (CC, CSTS, NSSR) · Base 2.4 §3.1.4 (CAP, VS) · Base 2.4 §3.1.4 (AQA, ASQ, ACQ, CMBLOC) · Base 2.4 §3.1.4 (CRTO) · Base 2.4 §3.5.1 · Base 2.4 §3.5.3–3.5.4
需要時回顧本篇名詞
- Controller / namespace
- controller 接收命令並管理存取;namespace 是命令可指定的一份邏輯儲存空間。NVM subsystem 則包含 controller 與非揮發儲存資源,同一 subsystem 可以有多個 controller。
- SQ / CQ / SQE / CQE
- Submission Queue(SQ)是提交佇列,Completion Queue(CQ)是完成佇列;SQE 與 CQE 分別是其中的一筆命令及完成項目。QID 識別 queue,CID 區分同一 SQ 中尚未完成的命令,NSID 則識別 namespace。
- Register / Identify / Feature / Log
- Register 提供可存取的控制或狀態資訊;Identify 查詢物件的能力與屬性;Feature 用來讀取或變更工作設定;Log Page 回報特定種類的狀態或紀錄。FID、LID、CNS、CSI 則分別用來選擇 Feature、Log Page、Identify 資料結構及命令集。
- index / offset / zero-based
- index 指出清單中的第幾筆,通常從 0 起算;offset 表示與起點相隔多遠,解讀時必須確認單位。若數量欄位採 zero-based 編碼,實際數量等於欄位值加 1;但不是所有欄位看到 0 都要加 1。Dword 是 4 bytes,1 byte 是 8 bits。
- Scope / reset / retention
- scope 表示操作影響哪些物件;retention 表示狀態是否保留。清除 CC.EN 所觸發的 Controller Reset,是 Controller Level Reset(CLR)的一種。同屬 CLR 的不同觸發方式,仍可能採用不同的 Register 保留規則。
本冊題目
- Q01 · Host 應如何從 CAP 與 VS 確認 NVMe 版本、最大 Queue 大小、Timeout、Doorbell 間距、Memory Page Size 及支援的 Command Set?
- Q02 · AQA、ASQ、ACQ 與 CC 各欄位應按照什麼順序設定?設定錯誤時可能發生什麼?
- Q03 · Host 設定 CC.EN 後,應如何根據 CAP.TO 與 CSTS.RDY 判斷 Controller 是否成功 Enable?
- Q04 · Host 清除 CC.EN 後,應如何判斷 Controller 是否成功 Disable?尚未 Disable 完成時能否重新 Enable?
- Q05 · Host 能否在 CSTS.RDY 為 0 時送出 Command 或更新 Doorbell?
- Q06 · CSTS.CFS 代表什麼?Controller 初始化失敗或進入 Fatal 狀態時,Host 應如何恢復?
- Q07 · Controller 初始化後可能進入哪些 Ready Mode?Host 應如何處理暫時或限制性的 Ready 狀態?
- Q08 · Controller Enable、Disable、Controller Reset、NVM Subsystem Reset 與 Shutdown 有什麼差異?
- Q09 · Controller Reset 後,哪些 Register、Admin Queue、Feature 與 I/O Queue 需要重新設定?
Q01 Host 應如何從 CAP 與 VS 確認 NVMe 版本、最大 Queue 大小、Timeout、Doorbell 間距、Memory Page Size 及支援的 Command Set?
跟著解說理解
Host 必須先知道 controller 支援哪些配置,才能正確初始化介面。CAP 用來宣告支援能力,CC 則記錄 Host 實際選用的設定,因此不能直接把 CAP 的能力位元複製到 CC。
1. 先確認資料的來源與範圍
讀取 CAP 與 VS 只會取得目標 controller 的資訊,不會改變 queue 或媒體狀態。即使已確認 NVMe 版本,Host 仍須逐項檢查選配功能,因為版本相同不代表支援的功能完全相同。
VS 的 MJR、MNR、TER 欄位共同表示版本。Queue 與命令集能力則由 CAP 提供:MQES+1 是單一 I/O queue 的 entry 數量上限,CQR 說明是否要求實體記憶體連續,CSS 則說明支援哪些命令集選擇方式。
2. 欄位、單位與判讀例子
這些欄位使用不同的編碼方式。CAP.TO 以 500 ms 為單位;相鄰 Doorbell 的間距是 2^(2+DSTRD) bytes;可選的記憶體頁面大小則介於 2^(12+MPSMIN) 與 2^(12+MPSMAX) bytes。判斷啟用逾時時,還必須一併讀取 CRTO。
Host 先建立 NVMe Register 的位址映射,再讀取 VS 與 CAP。根據讀到的能力,選擇合法的 MPS、CSS、AMS 與 Ready Mode,接著配置 queue。若 IOCSS=1,則在啟用後以 Identify CNS 1Ch 查詢可使用的命令集組合。
- CNS
- Controller or Namespace Structure,選擇Identify回傳結構
讀取成功後,Host 應能算出合法的配置範圍;這次 Register 讀取本身不會產生 CQE。例如,MQES=03FFh 表示最多 1024 個 queue 位置,而 DSTRD=2 表示相鄰 Doorbell 相隔 16 bytes。
- CQE
- Completion Queue Entry,佇列中的完成項目
3. 判讀時要保留的條件
讀取唯讀 Register 不會以 Invalid Field CQE 回覆錯誤。至於後續設定,若 Host 把不支援的值寫入 CC.MPS 或 CC.AMS,規範可能將結果定義為 undefined behavior;此時不能要求 controller 回傳某個固定錯誤碼。
- CQE
- Completion Queue Entry,佇列中的完成項目
驗證時,應確認 CC.CSS 選用的命令集符合 CAP.CSS 宣告的能力及 Identify 回報的組合。同樣地,Create Queue 的 QSIZE 必須符合 MQES 限制。Admin Queue 則另受 AQA 的 4096 個位置上限約束,不能與 I/O queue 的上限混為一談。
來源:Base 2.4 §3.1.4 (CAP, VS) · Base 2.4 §3.1.4 (CRTO) · Base 2.4 §3.5.1 · Base 2.4 §3.7.1–3.7.4 · Base 2.4 §5.2.13.1.14 (header, reset, hardware, Set Feature events) · Base 2.4 §9.1–9.6.1
Q02 AQA、ASQ、ACQ 與 CC 各欄位應按照什麼順序設定?設定錯誤時可能發生什麼?
跟著解說理解
Host 必須先準備 Admin SQ 與 CQ 的記憶體,再把位置與大小告訴 controller。這樣 controller 啟用後,才有可用的通道接收管理命令並回報結果。
- SQ
- Submission Queue,提交佇列
- CQ
- Completion Queue,完成佇列
1. 操作前先準備什麼
這些設定影響目標 controller 的管理介面。若 queue 位址填錯,controller 就可能無法讀取命令或寫入完成結果,導致後續 Identify、Get Features 等命令都無法正常完成。
先從 CAP 確認可用的 MPS 範圍、CSS、AMS 與 CRMS,再檢查 AQA 對 Admin Queue 長度的限制。Host 選用的配置必須同時符合這些條件。
AQA.ASQS 與 ACQS 儲存的是 entry 數量減 1;ASQ 與 ACQ 則提供實體起始位址,且必須依 CC.MPS 對齊。CC 還需設定 CSS、MPS、AMS 與 CRIME。若使用 NVM I/O,IOSQES 與 IOCQES 分別設為 6 與 4。
2. 先後順序與完成條件
先等待前一次重設完成,確認 RDY=0,再配置實體連續的 Admin Queue 記憶體,並把 Admin CQ 的 Phase 初始化為 0。接著,在 EN=0 時寫入 AQA、ASQ、ACQ 及合法的 CC 設定。將 EN 設為 1 後,等待 RDY=1。I/O entry 大小則必須在建立 I/O Queue 前設定完成。
- CQ
- Completion Queue,完成佇列
初始化成功後,Host 可以透過 Admin Queue 提交 Identify。不過,I/O Queue 仍需另外建立;若採 Independent mode,也不能只憑 RDY=1 就認定所有媒體都已就緒。
3. 未符合條件時如何處理
例如,以 AQA size=0 的配置啟用 controller、在 EN=1 時修改 MPS,或選用不支援的 MPS/AMS,都可能落入規範所稱的 undefined behavior。這些是 Register 使用方式的問題,不能擅自規定 controller 必須回傳 Invalid Field CQE。
驗證時,先確認 Register 的編碼正確,再確認 Admin CQ 能收到與原命令 CID 相符的 Identify 完成結果。CC.EN=1 只表示 Host 已要求啟用,單憑這個值還不足以證明初始化完成。
- CID
- Command Identifier,同一提交佇列內的命令識別碼
來源:Base 2.4 §3.1.4 (AQA, ASQ, ACQ, CMBLOC) · Base 2.4 §3.1.4 (CC, CSTS, NSSR) · Base 2.4 §3.5.1 · Base 2.4 §3.7.1–3.7.4 · Base 2.4 §5.2.13.1.14 (header, reset, hardware, Set Feature events) · Base 2.4 §9.1–9.6.1
Q03 Host 設定 CC.EN 後,應如何根據 CAP.TO 與 CSTS.RDY 判斷 Controller 是否成功 Enable?
跟著解說理解
Host 寫入啟用要求後,controller 還需要時間準備。這題要分辨「已要求啟用」與「已能處理命令」,並選對等待期限,避免過早重設;在 Base 2.4 中,判斷時也必須納入 CRTO。
1. 操作前先準備什麼
這裡判斷的是目標 controller 的啟用狀態。至於媒體是否已可存取,還要配合所選的 Ready Mode,不能只看一個 RDY 值。
讀取 CAP.CRMS、CC.CRIME、CRTO.CRWMT/CRIMT 及 CAP.TO,確認目前採用哪種 Ready Mode 及等待期限。不能假設所有啟用情況都只需要查看 CAP.TO。
2. 先後順序與完成條件
下圖把介面就緒與媒體就緒分開。兩個計時器都從 Enable 起算,不是在 RDY=1 後才開始等媒體。
- 起點:CC.EN 由 0 變 1
記下時間與 CC.CRIME;讀取 RDY、CFS,持續確認初始化狀態。
- 分支 A:With Media
以 CRWMT 判斷就緒期限。CRTO 的單位是 500 ms;到 RDY=1 才提交此模式允許的命令。
- 分支 B:Independent
先以 CRIMT 判斷介面就緒,再以 CRWMT 判斷媒體期限。RDY=1 不代表媒體已健康可用;仍須遵守命令的媒體就緒條件。
- 回到同一條時間軸驗證
教學假設 CRIMT=2、CRWMT=20:介面期限在 Enable 後 1 s,媒體期限在 Enable 後 10 s。
A、B 是不同模式,不是依序執行的兩個操作。若發生初始化失敗,須連同 CFS 與失敗條件判斷,不能只因曾看到 RDY=1 就宣告成功。
3. 未符合條件時如何處理
透過 Register 啟用 controller,不會產生 CQE。若媒體尚未就緒,只有符合對應條件的命令,才能回報 Namespace Not Ready(SCT=0, SC=82h)或 Admin Command Media Not Ready(0/24h)。
- SCT
- Status Code Type,完成狀態代碼類型
應把啟用時間、CRIME、命令種類與回傳 Status 放在同一條時間軸上核對。Figure 84 只允許列出的 Admin 命令在特定條件下回報媒體尚未就緒,並非所有 Admin 命令都能用這個理由暫時拒絕執行。
4. 錯誤完成與紀錄要如何對照
透過 Register 啟用 controller,不會產生 CQE,因此這個動作本身沒有 DNR 或 More。Independent mode 在合法等待期間,若命令因媒體尚未就緒而失敗,可以回報 DNR=0;超過 CRWMT 後,就不得繼續以相同的暫時性理由回報 DNR=0。More 則依 Error Information Log 是否有該命令的補充資訊設定。
- DNR
- Do Not Retry,命令重試的狀態提示
若發生 §3.5.4.1 定義的初始化期限失敗,而且 controller 支援 PEL,必須記錄 NVM Subsystem Hardware Error Event,原因為 Controller Ready Timeout Exceeded。這是失敗條件觸發的紀錄,不是每次 Enable 成功都必須新增的事件。
來源:Base 2.4 §3.1.4 (CAP, VS) · Base 2.4 §3.1.4 (CRTO) · Base 2.4 §3.5.3–3.5.4 · Base 2.4 §3.5.1 · Base 2.4 §3.7.1–3.7.4 · Base 2.4 §5.2.13.1.14 (header, reset, hardware, Set Feature events) · Base 2.4 §9.1–9.6.1
Q04 Host 清除 CC.EN 後,應如何判斷 Controller 是否成功 Disable?尚未 Disable 完成時能否重新 Enable?
跟著解說理解
Host 必須確認上一輪命令處理已停止,才能開始下一輪初始化。等待停用完成,就是為了建立這個明確的分界。
1. 操作前先準備什麼
清除 EN 會觸發目標 controller 的重設,影響其所有 I/O Queue。因此,這個動作並不是只暫停其中一條 SQ。
- SQ
- Submission Queue,提交佇列
CAP.TO 說明清除 EN 後,Host 應等待 RDY 從 1 變成 0 的最長時間。驗證時,也應保存 CC、CSTS 的讀值及時間,才能確認轉移是否在期限內完成。
在正常停用流程中,Host 從 EN=1、RDY=1 的狀態清除 EN。清除後還必須等到 RDY=0,才能重新啟用 controller。
2. 先後順序與完成條件
Host 先停止提交新命令,再清除 EN,並持續讀取 RDY。等到 RDY=0 後,重新初始化 Admin CQ 與 Host 的命令追蹤資料,完成 CC 設定,最後才把 EN 設回 1。
RDY=0 才是停用完成的判斷依據,不需要等到每筆舊命令都收到獨立 CQE。此時原有的 I/O Queue 已失效,不能繼續使用。
3. 未符合條件時如何處理
若 RDY 還是 1,Host 就把 EN 從 0 設回 1,結果屬於 undefined behavior。由於這是 Register 操作,不是提交 Admin 命令,因此不能要求 controller 以 Command Sequence Error 回覆。
核對 EN、RDY 的轉移順序後,還應確認 Host 已停止使用舊 queue。即使舊記憶體裡仍看得到資料,也不代表該 queue 仍可繼續運作。
來源:Base 2.4 §3.1.4 (CC, CSTS, NSSR) · Base 2.4 §3.1.4 (CAP, VS) · Base 2.4 §3.7.1–3.7.4 · Base 2.4 §5.2.13.1.14 (header, reset, hardware, Set Feature events) · Base 2.4 §9.1–9.6.1
Q05 Host 能否在 CSTS.RDY 為 0 時送出 Command 或更新 Doorbell?
跟著解說理解
Host 可以先在記憶體中準備 SQE,但準備完成並不等於已提交命令。更新 SQ Tail Doorbell 才會通知 controller 有新命令,因此必須等到 controller 與 queue 都可用時才能進行。
- SQE
- Submission Queue Entry,佇列中的命令項目
1. 何時可以提交命令
這個限制適用於該 PCIe controller 的 Admin 與 I/O 命令提交。初始化時先設定 Admin Queue Register 是建立通道的步驟,不能將它視為已經送出命令。
判斷能否提交時,必須同時確認 CSTS.RDY、CC.EN 及目標 queue 是否存在。即使 RDY=1,也仍需檢查 queue 是否已建立,以及 controller 是否處於 shutdown 狀態。
先等到 RDY=1,並確認目標 queue 已建立且尚未刪除。接著,讓 SQE 的內容對裝置可見,再更新 SQ Tail Doorbell,完成提交。
- SQE
- Submission Queue Entry,佇列中的命令項目
2. Doorbell 不能取代就緒條件
SQ Tail Doorbell 告訴 controller 哪些新命令已提交;CQ Head Doorbell 則告訴 controller,Host 已處理到哪個完成位置。這兩種通知都不能讓尚未就緒的 controller 提前進入 Ready 狀態。
若 Host 在 controller 或 queue 尚不可用時提交,不能期待收到固定的錯誤 CQE。原因是停用中的 Admin Queue 本來就無法作為可靠的錯誤回報通道。
如果看到 EN=1、RDY=0 且等待逾時,應先檢查初始化是否完成。此時尚未合法提交的 Identify 沒有回覆,不能據此判定裝置不支援 Identify。
來源:Base 2.4 §3.3.3–3.4.1 · Base 2.4 §3.3.1 · Base 2.4 §3.1.4 (CC, CSTS, NSSR) · PCIe Transport 1.4 §3.1–3.4 · Base 2.4 §3.7.1–3.7.4 · Base 2.4 §5.2.13.1.14 (header, reset, hardware, Set Feature events) · Base 2.4 §9.1–9.6.1
Q06 CSTS.CFS 代表什麼?Controller 初始化失敗或進入 Fatal 狀態時,Host 應如何恢復?
跟著解說理解
CFS 通常表示 controller 處於嚴重異常狀態,與單筆命令失敗不同。不過,在虛擬化配置中,secondary controller 進入 Offline 也會設定 CFS。因此,判斷硬體故障前,應先確認 controller 的角色及 Online/Offline 狀態。
1. 先保留哪些證據
嚴重的 controller 異常可能影響整個命令服務;某個 namespace 的媒體錯誤,則不一定具有相同的影響範圍。兩者需要分別判斷。
應一併觀察 CSTS.CFS、RDY、CC.EN 與適用的等待期限。Identify 中宣告支援某項選配功能,並不會讓 Host 可以忽略 CFS 所指出的狀態。
先保存 Register,以及已取得的 CQE 和 Log。若管理通道仍可使用,再讀取其他診斷資訊;若通道已無回應,就不能無限等待 Get Log Page 完成。
2. 依什麼順序排除原因
先確認 Register 讀取仍有效,以及 CFS 真的是 1;不可將失效讀取的全 1 值直接解碼成每個狀態位都成立。
Host 應根據故障情況,以及目前還能存取哪些控制介面,選擇適當的 Controller Level Reset。等狀態轉移完成後,再重新初始化。若控制介面完全沒有回應,則需要平台層的恢復處理;一次清除 CC.EN 並不保證能排除所有故障。
3. 把觀察結果接回規格條件
恢復後,還要確認 RDY 正常、Identify 可完成,而且新 queue 能正確處理命令。CFS 已清除只表示該狀態不再成立,不能單憑這點認定資料完整性也已通過驗證。
若 controller 還能回報受影響命令的結果,Internal Error(SCT=0, SC=06h)可能適用。若故障已嚴重到無法透過 CQE 溝通,則可能改由 CFS 指示異常;此時不能要求每筆命令都留下 CQE。
應對照同一時間的 CFS、初始化等待期限與硬體錯誤紀錄,確認它們是否指向相同事件。單筆命令回傳 Invalid Field,並不足以證明 controller 已進入 Fatal 狀態。
來源:Base 2.4 §3.1.4 (CC, CSTS, NSSR) · Base 2.4 §9.1–9.6.1 · Base 2.4 §3.5.3–3.5.4 · Base 2.4 §3.7.1–3.7.4 · Base 2.4 §5.2.13.1.14 (header, reset, hardware, Set Feature events) · Base 2.4 §8.2.7
Q07 Controller 初始化後可能進入哪些 Ready Mode?Host 應如何處理暫時或限制性的 Ready 狀態?
跟著解說理解
Ready Mode 決定 controller 何時可以開始服務。Independent 模式允許管理命令在媒體初始化完成前先開始執行,但媒體仍必須在規定的期限內就緒。
1. 機制與適用範圍
這裡討論兩種模式:Controller Ready With Media,以及 Controller Ready Independent of Media。它們規定的是介面與媒體的就緒關係,而不是額外定義一組可任意解讀的 degraded-ready 狀態碼。
CRIME=0 選擇 With Media,CRIME=1 選擇 Independent。判斷當下允許執行哪些命令時,要一起檢查 CSTS.RDY、CRTO.CRIMT/CRWMT,以及 Figure 84 的命令分類。
2. 用操作與結果理解
CAP.CRMS 中的 CRWMS、CRIMS 分別宣告兩種模式的支援能力。當 CAP.CRMS=11b 時,Host 可以透過 CC.CRIME 選擇要使用的模式。
Host 必須在啟用前選好模式。若選擇 Independent 模式,RDY=1 後可先執行不依賴媒體的查詢;需要媒體的命令若收到允許的暫時性 Status,則延後處理。同時仍要追蹤從 Enable 開始計算的 CRWMT,不能重新起算。
With Media 模式正常就緒時,controller 應已能處理所要求的媒體存取。Independent 模式的 RDY=1 則先表示介面及適用命令已可服務,尚不能據此認定所有 namespace 都已就緒。
3. 容易誤判的地方
在規範允許的條件下,controller 可以回傳 0/82h 或 0/24h;其中 0/24h 只適用於 Independent 模式下特定的 Admin 命令。超過媒體就緒期限後,若仍以同一個暫時等待理由回報 DNR=0,就不符合該期限的要求。
同時核對 CAP 宣告、CC 選擇、timeout 與命令行為。CSTS.PP 是另一種暫停處理指示,不是第三個 Ready Mode。
來源:Base 2.4 §3.5.3–3.5.4 · Base 2.4 §3.1.4 (CRTO) · Base 2.4 §3.1.4 (CC, CSTS, NSSR) · Base 2.4 §3.7.1–3.7.4 · Base 2.4 §5.2.13.1.14 (header, reset, hardware, Set Feature events) · Base 2.4 §9.1–9.6.1
Q08 Controller Enable、Disable、Controller Reset、NVM Subsystem Reset 與 Shutdown 有什麼差異?
跟著解說理解
這幾個動作分別處理開始服務、停止並重設,以及移除電源前的準備。先分清它們的目的,才能避免用 Reset 取代原本需要的正常 Shutdown。
1. 差別在哪裡
啟用或清除 CC.EN 的作用對象是單一 controller。NVM Subsystem Reset 則依規範涵蓋相應的 subsystem 或 domain 範圍;Shutdown 也另有 controller 與 subsystem 層級,必須先確認使用的是哪一種。
Enable:EN 0→1。Controller Reset:EN 1→0。NSSR.NSSRC 寫 4E564D65h 觸發支援的 subsystem reset。正常 controller shutdown 用 CC.SHN=01b,觀察 CSTS.SHST=10b。
2. 如何選擇與確認
CAP.NSSRS 可用來確認是否支援 NSSR。判斷 Shutdown 的作用範圍時,則還要查看 CAP 宣告的 shutdown 能力與 CSTS.ST。
若準備正常移除電源,Host 應先協調 I/O,再送出 Shutdown 通知,並等待關機處理完成。若目的是故障恢復,則選擇合適的 Reset,之後重新建立命令處理環境。
不同動作有不同的完成判斷:啟用時等待 RDY=1;停用或重設時檢查對應的狀態轉移;Shutdown 則等待 SHST=10b。Shutdown 完成不表示所有 Register 都已回到重設值。
3. 比較時要保留的條件
Register 操作本身沒有 CQE。Shutdown 過程中,controller 可以對適用命令回報 Commands Aborted due to Power Loss Notification(0/05h);但不能因此把所有 Reset 中未完成的命令,都預期為相同 Status。
應先記錄觸發方式與影響範圍,再比較操作前後保留了哪些值。如果紀錄只寫「reset」,就無法說明 AQA、PCIe 狀態與 Feature 為何有不同的保留結果。
來源:Base 2.4 §3.1.4 (CC, CSTS, NSSR) · Base 2.4 §3.6.1 · Base 2.4 §3.7.1–3.7.4 · Base 2.4 §5.2.13.1.14 (header, reset, hardware, Set Feature events) · Base 2.4 §9.1–9.6.1
Q09 Controller Reset 後,哪些 Register、Admin Queue、Feature 與 I/O Queue 需要重新設定?
跟著解說理解
重設後,Host 需要重新建立可用的命令處理環境。這樣才能把新命令與上一輪的 queue 指標、Phase 及未完成命令分開處理。
1. 先界定觸發方式與影響對象
本題只討論清除 CC.EN 所觸發的 Controller Reset。FLR 與 NVM Subsystem Reset 來自不同觸發方式,不能直接套用這裡的 Register 保留規則。
- FLR
- Function Level Reset,以功能為範圍的重設
先查看 §3.7.2 的重設例外,以及各 Register 的 Reset 欄,確認哪些值會保留。Feature 則還要考慮作用範圍、是否可保存設定,以及 Figure 126、127、466 的恢復規則。
2. 哪些狀態改變,恢復後怎麼處理
這種重設會保留 AQA、ASQ、ACQ、指定的 PMR Register 與 CMBMSC,但仍會重設 Admin Queue 的指標,並刪除所有 I/O SQ/CQ。Host 因此需要重新配置 CC。Feature 的恢復方式則另行判斷:可保存設定者依重設範圍恢復 Saved,沒有 Saved 時使用 Default;不可保存設定者依持續性規則處理。HMB 也需要重新配置。
- PMR
- Persistent Memory Region,持久性記憶體區域
- HMB
- Host Memory Buffer,主機記憶體緩衝
先等到 RDY=0,確認保留的 Admin Queue 記憶體仍可使用,並把 Admin CQ 的 Phase 初始化為 0。完成配置並啟用後,重新查詢必要的能力與 Feature,再協商 Number of Queues,最後依序建立 CQ 與 SQ。
重建成功後,新命令應能在新建立的 queue 上正常完成。即使沿用相同的 QID 或記憶體位址,也不表示上一輪 queue 可以接續使用。
3. 如何驗證保留或恢復結果
重設中斷的舊命令沒有統一、必須回傳的「Reset Status」。重建時若使用非法 QID 或大小,則依對應 Create 命令的規則判斷。直接對舊 queue 更新 Doorbell,不能代替重建流程。
應比較重設前後的 Register、Get Features 回覆與實際可用的 Queue 配置。尤其要分清楚:AQA 的值被保留,不代表 Admin CQ 裡的舊內容仍然有效。
先確認 Host 已清除上一輪未完成命令的對照資料,並重新初始化 Phase。即使新命令重用了相同 CID,也不能把它對應到上一輪的命令。
- CID
- Command Identifier,同一提交佇列內的命令識別碼
來源:Base 2.4 §3.7.1–3.7.4 · Base 2.4 §4.4 · Base 2.4 §5.2.30.1 (common fields, scope and persistence) · Base 2.4 §3.1.4 (AQA, ASQ, ACQ, CMBLOC) · Base 2.4 §5.2.13.1.14 (header, reset, hardware, Set Feature events) · Base 2.4 §9.1–9.6.1
原文定位與既有圖表判讀
Base 的文件頁碼等於 PDF 頁碼減 26;NVM 與 PCIe 兩份規格的文件頁碼則與 PDF 頁碼相同。以下依提供的 PDF 本文列出章節、頁碼及 Figure 編號。若同一頁包含其他主題,只引用本題需要的定義,不納入 Fabrics 或 PCIe Link、封包內容。
- Base 2.4 · §3.1.4 (CAP, VS)
文件頁 54–59 · PDF 80–85 · Figure 36–37 - Base 2.4 · §3.1.4 (CC, CSTS, NSSR)
文件頁 60–66 · PDF 86–92 · Figure 41–43 - Base 2.4 · §3.1.4 (AQA, ASQ, ACQ, CMBLOC)
文件頁 66–68 · PDF 92–94 · Figure 44–47 - Base 2.4 · §3.1.4 (CRTO)
文件頁 72–73 · PDF 98–99 · Figure 57 - Base 2.4 · §3.3.1
文件頁 88–91 · PDF 114–117 · Figure 73–74 - Base 2.4 · §3.3.3–3.4.1
文件頁 101 · PDF 127 - Base 2.4 · §3.5.1
文件頁 105–106 · PDF 131–132 - Base 2.4 · §3.5.3–3.5.4
文件頁 109–113 · PDF 135–139 · Figure 84–85 - Base 2.4 · §3.6.1
文件頁 114–115 · PDF 140–141 - Base 2.4 · §3.7.1–3.7.4
文件頁 120–124 · PDF 146–150 - Base 2.4 · §4.4
文件頁 166–169 · PDF 192–195 · Figure 126–127 - Base 2.4 · §5.2.13.1.14 (header, reset, hardware, Set Feature events)
文件頁 244–256, 258, 262–264 · PDF 270–282, 284, 288–290 · Figure 232–244, 246, 252–253 - Base 2.4 · §5.2.30.1 (common fields, scope and persistence)
文件頁 456–460 · PDF 482–486 · Figure 463–466 - Base 2.4 · §8.2.7
文件頁 754–758 · PDF 780–784 · Figure 796 - Base 2.4 · §9.1–9.6.1
文件頁 825–826 · PDF 851–852 - PCIe Transport 1.4 · §3.1–3.4
文件頁 9–13 · PDF 9–13 · Figure 3–8
需要看欄位圖時
以下連結可開啟對應的圖表教學,查閱欄位及判讀方式。每張圖保留固定的教學位置,方便之後反覆查詢。
- Base 2.4 Figure 36 · Offset 0h: CAP – Controller Capabilities
- Base 2.4 Figure 41 · Offset 14h: CC – Controller Configuration
- Base 2.4 Figure 42 · Offset 1Ch: CSTS – Controller Status
- Base 2.4 Figure 44 · Offset 24h: AQA – Admin Queue Attributes
- Base 2.4 Figure 45 · Offset 28h: ASQ – Admin Submission Queue Base Address
- Base 2.4 Figure 46 · Offset 30h: ACQ – Admin Completion Queue Base Address
使用的原始文件
- NVM Express Base Specification · Revision 2.4 · 2026-07-31
NVM-Express-Base-Specification-Revision-2.4-Ratified-2026.07.31.pdf - NVM Express NVM Command Set Specification · Revision 1.3 · 2026-07-31
NVM-Express-NVM-Command-Set-Specification-Revision-1.3-Ratified-2026.07.31.pdf - NVM Express NVMe over PCIe Transport Specification · Revision 1.4 · 2026-07-31
NVM-Express-NVMe-over-PCIe-Transport-Specification-Revision-1.4-Ratified-2026.07.31.pdf


Comments