NVMe 圖表判讀與情境練習 06 · 健康、事件與診斷紀錄
反覆查詢 · 欄位判讀 · 原文定位
NVMe 圖表判讀與情境練習 06 · 健康、事件與診斷紀錄
先確認讀取參數與支援,再分清目前狀態、累計數與歷史快照。Telemetry 和持久事件的版本、長度與讀取生命週期,會決定資料能否正確串接。
先跟著一個情境讀規格
以下回傳資料均為教學假設。先看需求與已知條件,再沿閱讀路線找到相關欄位,接著一起判讀結果。完整解說直接顯示,來源細節可另外展開。
練習 01SMART 顯示 120%,是不是已經不能用了?
健康報告只顯示一個紅色「120%」。請把真正能從 SMART 得到的結論拆開。
模擬回傳與已知條件
- LID=02h:Percentage Used=120;Available Spare=9;Available Spare Threshold=10;Critical Warning 的 spare 位=1。
- Composite Temperature=300 K;本次沒有提供近期 I/O 成敗紀錄。
這個情境要連起哪些規格圖表?
下面是閱讀規格的順序;實際操作的先後與等待條件,會在情境解說中另外交代。
- 先辨識每個量的用途
在 SMART/Health 圖表分別找到 Percentage Used、Available Spare 與門檻,先讀各自的定義及單位。
Base 2.4 · Figure 213 - 把警告和對應數值配起來
回到同一張表的 Critical Warning,對照備援空間的警告位元,再讀 Available Spare 與門檻。
Base 2.4 · Figure 213 - 分項說明觀察結果
溫度、壽命估計與備援警告各自列出;需要判斷目前 I/O 行為時,再補實際操作資訊。
Base 2.4 · Figure 213
沿著欄位一步步理解
查詢次序:Get Log Page LID=02h 取得 SMART/Health;保留 warning bitmap 與各自的數值欄位,不合併成一個「健康分數」。
推導 1Percentage Used 是預估壽命耗用,容許超過 100;120 不等於已損壞 120%,也不能單獨證明裝置現在不能讀寫。
推導 2Available Spare=9 低於門檻 10,且對應 warning 已置位,這才是本例可直接說明的備援空間警告。300 K 約為 26.85°C,屬另一種量測,不應與百分比相加。
推導 3完整報告應分列壽命估計、目前警告及近期錯誤/I/O 行為。要判定能否繼續服務,還需要系統需求與實際行為資料;這份 log 不提供一個能替代全部判斷的總分。
完整原文定位
- Base 2.4 · §5.2.13.1.3 · Figure 213 · SMART / Health Information Log Page · 文件頁 221–225 · PDF 247–251
接著看其他情境
練習 02Data Units Written 增加 4,實際寫了多少?
監控程式將 SMART 的 Data Units Written 差值乘以 512,得到很小的寫入量。這少算了什麼?
模擬回傳與已知條件
- 相同對象的兩次 DUW:1000 → 1004;計數有效,無重置或飽和;取樣相隔 60 seconds。
- Host Write Commands 同期增加 80;沒有完整命令大小清單。
沿著欄位一步步理解
查詢次序:兩次 Get Log Page LID=02h;同時保存 NSID、取樣時間、DUW 與 Host Write Commands。
- NSID
- Namespace Identifier,邏輯儲存空間識別碼
推導 1DUW 以 1000 個 512-byte units 為一個回報單位,並向上取整。差值 4 對應約 4×1000×512=2048000 bytes 的量級,不是 2048 bytes。
推導 2兩個端點都經過取整,因此這不是精確的 60 秒 payload byte 數。拿它除以 80,也只能得到粗略平均,不能反推每個 Write 都是同樣大小。
推導 3要驗證某筆命令的長度,回到命令 NLB 與使用中 LBA 格式;要看长期趨勢,才使用這種累計差值。也不要把 host 寫入量直接當作 NAND 實際寫入量。
- LBA
- Logical Block Address,邏輯區塊位址
完整原文定位
- Base 2.4 · §5.2.13.1.3 · Figure 213 · SMART / Health Information Log Page · 文件頁 221–225 · PDF 247–251
- NVM Command Set 1.3 · §3.3.4 · Figure 54 · Read – Command Dword 12 · 文件頁 49 · PDF 49
- NVM Command Set 1.3 · §4.1.5.1 · Figure 125 · LBA Format Data Structure, NVM Command Set Specific · 文件頁 94 · PDF 94
練習 03指定 NSID,就能得到該 namespace 的 SMART 嗎?
- NSID
- Namespace Identifier,邏輯儲存空間識別碼
報表把同一張 SMART 複製到每個 namespace,並聲稱是各自的使用量。能力資料是否支持這樣標示?
模擬回傳與已知條件
- Identify Controller 的 LPA:per-namespace SMART/Health 支援位=0。
- 目前讀取的是 NSID=FFFFFFFFh 的 LID=02h;controller 有 4 個 active namespaces。
沿著欄位一步步理解
查詢次序:Identify CNS=01h 查 LPA;按 SMART 定義選擇 NSID;能力不提供的細分資訊不能靠改報表標籤補出來。
推導 1此份資料不是 4 份獨立的 per-namespace 統計。NSID=FFFFFFFFh 的回報應依該 log 的總體範圍標示,不能複製後再相加,否則同一份量會被重複算 4 次。
推導 2想改用特定 NSID,先要有 per-namespace SMART 支援,並遵守該 log 的 namespace 規則。不能因 Get Log Page 有 NSID 欄位,就假設每個 LID 都提供任意層級的統計。
推導 3若需要區分 Endurance Group,可再查 namespace 的 ENDGID 與 LID=09h;那仍是 group 統計,不是自動變成單一 namespace 或檔案系統統計。
完整原文定位
- Base 2.4 · §5.2.14.2.1 · Figure 338 · Identify – Identify Controller Data Structure, I/O Command Set Independent · 文件頁 355–356 · PDF 381–382
- Base 2.4 · §5.2.13.1.3 · Figure 213 · SMART / Health Information Log Page · 文件頁 221–225 · PDF 247–251
- Base 2.4 · §5.2.13.1.10 · Figure 225 · Endurance Group Information Log Page · 文件頁 238–239 · PDF 264–265
練習 04兩個 namespace 的警告其實來自同一個 group?
管理系統對 NSID=2、NSID=9 各發出一次耐久度警告。要怎麼判斷是否重複通報同一個對象?
模擬回傳與已知條件
- 兩個 namespace 的 Identify 資料均為 ENDGID=3;LID=09h、LSI=3 的 Critical Warning 非零。
- 沒有 group 4 的查詢結果,也沒有證據顯示 namespace 配置在期間變更。
沿著欄位一步步理解
查詢次序:Identify CNS=00h、各自 NSID → ENDGID → Get Log Page LID=09h、LSI=ENDGID。
推導 1兩個 namespace 都指向 group 3,因此同一份 group log 可以影響兩個 namespace 的風險呈現;但警告來源只有一個 group。報表應保留 namespace 與 group 的對應,不把它算成兩個獨立 group 故障。
推導 2LSI 在這個 LID 用來選 Endurance Group,不是 NSID,也不是傳輸長度的高位。把 NSID=9 填成 LSI=9,會查另一個對象,無法回答 group 3 的問題。
推導 3group 3 的警告也不能延伸成所有 group 都有警告。若要比較 group 4,必須先確認其存在並取得同時段、相同欄位的資料。
完整原文定位
- Base 2.4 · §5.2.13.1.10 · Figure 225 · Endurance Group Information Log Page · 文件頁 238–239 · PDF 264–265
- Base 2.4 · §5.2.13 · Figure 205 · Get Log Page – Command Dword 11 · 文件頁 214 · PDF 240
- NVM Command Set 1.3 · §4.1.5.1 · Figure 123 · Identify – Identify Namespace Data Structure, NVM Command Set · 文件頁 90–93 · PDF 90–93
練習 05Self-test 沒有在跑,FLBA=0 就表示 LBA 0 壞了?
- LBA
- Logical Block Address,邏輯區塊位址
工具同時顯示「測試卡在 45%」及「LBA 0 故障」。請用欄位有效性找出兩個誤判。
模擬回傳與已知條件
- LID=06h:目前 DSTOS=0,完成百分比 bytes 留著 45。最新結果 DSTR=2。
- 最新結果的 VDINFO.FVLD=0,而 FLBA 原始 bytes 全為 0。
沿著欄位一步步理解
查詢次序:Get Log Page LID=06h;先讀目前 operation,再讀最新 Result 的 DSTR 與 VDINFO,最後才使用診斷欄位。
推導 1DSTOS=0 表示沒有正在執行的 self-test,進度欄應忽略。它不是一個仍有效但停住的 45% 進度,不能拿來計算「已經卡住多久」。
推導 2DSTR=2 表示操作因 Controller Level Reset 中止,與測試發現媒體失敗不同。應報告中止原因,而不是將所有非零結果統稱為測試失敗。
推導 3FVLD=0 使 FLBA 無效;零只是無效欄位中的原始值,不是有效的故障 LBA 0。對 NSID、SCT、SC 也要依各自有效位判斷,不能從填充 bytes 編造診斷。
- SCT
- Status Code Type,完成狀態代碼類型
完整原文定位
- Base 2.4 · §5.2.13.1.7 · Figure 218 · Device Self-test Log Page · 文件頁 230 · PDF 256
- Base 2.4 · §5.2.13.1.7 · Figure 219 · Self-test Result Data Structure · 文件頁 231–232 · PDF 257–258
練習 06分段 Telemetry 可以把兩個 generation 拼在一起嗎?
你要保存一次 controller-initiated telemetry,讀完後才發現前後 header 不同。這份合併檔還能當同一次快照嗎?
模擬回傳與已知條件
- LID=08h 首次 header:TCDGN=10、TCDA=1、DA1LB=3;最後重讀:TCDGN=11、TCDA=1。
- 兩次 header 之間分段讀取資料;無完整紀錄證明各 chunk 屬於哪一代。
沿著欄位一步步理解
查詢次序:Get Log Page LID=08h,保留 RAE、header 與每次 offset;對照 TCDGN、TCDA 及 Data Area 邊界。
推導 1generation 改變表示不能直接把這些 chunks 宣稱為同一份 capture。應標示一致性未確認,重新按該 log 的擷取與確認流程取得一份可追蹤的資料,而非只保留最後的 header。
推導 2DA1LB=3 表示 Data Area 1 到 block 3;block 0 是 512-byte header,因此 header 加 Area 1 的範圍是 4×512=2048 bytes。這個長度資訊不會消除 generation 不一致。
推導 3TCDA 是更新確認相關狀態,不是 payload 格式解碼器。即使完整取到同一代資料,內部內容仍可能由廠商定義;不能從共同 header 推測每個 vendor byte 的意義。
完整原文定位
- Base 2.4 · §5.2.13.1.9 · Figure 223 · Telemetry Controller-Initiated Log Page · 文件頁 236–237 · PDF 262–263
- Base 2.4 · §5.2.13 · Figure 204 · Get Log Page – Command Dword 10 · 文件頁 213 · PDF 239
- Base 2.4 · §5.2.13 · Figure 208 · Get Log Page – Command Dword 14 · 文件頁 214–215 · PDF 240–241
練習 07Persistent Event Log 的下一筆應從哪裡開始?
解析器讀完第一筆就錯位,而且重新建立 context 後遇到 Command Sequence Error。請分別檢查生命週期與長度計算。
模擬回傳與已知條件
- ACT=3 成功回傳 header,RCE=0;未釋放 context。第一筆 offset=512、EHL=21、EL=28、VSIL=8。
- header 的總長度足以容納此筆;ET/ETR 已確認為支援的格式。
沿著欄位一步步理解
查詢次序:Get Log Page LID=0Dh,以 ACT 管理 context;讀 header 後使用 ACT=0 讀取同一份 report,按 event header 走訪。
推導 1ACT=3 的 RCE=0 表示命令處理前沒有 reporting context,不表示成功後仍沒有。此時再送 ACT=1 去建立,會與已存在的 context 衝突;後續讀取應沿用它。
推導 2共同 header 長度為 EHL+3=24 bytes;EL=28 已包括 VSIL=8。Event Data 為 28−8=20 bytes,下一筆起點為 512+24+28=564,不能再加一次 VSIL。
推導 3每筆仍要檢查長度是否超出 TLL、ET/ETR 是否可解,再繼續讀。完成後按規則釋放 context;讀完整個報告並不代表其中一定保存了系統歷史上每件事。
完整原文定位
- Base 2.4 · §5.2.13.1.14 · Figure 232 · Persistent Event Log Specific Parameter Field · 文件頁 246 · PDF 272
- Base 2.4 · §5.2.13.1.14 · Figure 233 · Persistent Event Log Page · 文件頁 247–249 · PDF 273–275
- Base 2.4 · §5.2.13.1.14 · Figure 234 · Persistent Event Format · 文件頁 249–250 · PDF 275–276
01Get Log CDW10:讀哪份、讀多少、是否確認事件
Base 2.4 · Figure 204 · Get Log Page – Command Dword 10
§5.2.13 · 文件頁 213 · PDF 239
01.1 · 用途同一個 log 讀取命令可能附帶確認非同步事件的效果。查此表時,同時保留 LID、LSP 和 RAE,不只記錄 buffer 長度。
01.2 · 欄位與關係LID bits7:0 選 log;LSP bits14:8 由該 log 定義;RAE bit15 為保留事件;NUMDL bits31:16 是 Dwords 數量的低 16bits,與 NUMDU 合成後為減 1 編碼。RAE=0 通常在命令成功時確認相應事件,並非刪除所有 log 內容。
01.3 · 判讀與例子一般 512-byte 讀取需 128 Dwords,因此 NUMD=127。失敗的 Get Log 不能視為已確認事件;各 log 若另定動作或長度規則,應使用該 log 規則,例如 PEL 的 ACT3。
回本冊圖表索引02Get Log CDW11:長度高位與目標識別
Base 2.4 · Figure 205 · Get Log Page – Command Dword 11
§5.2.13 · 文件頁 214 · PDF 240
02.1 · 用途需要讀大型 log 或指定某個資源對象時,查 CDW11。上半部 LSI 不是 NUMD 的更多高位。
02.2 · 欄位與關係NUMDU bits15:0 與 CDW10.NUMDL 組成 32-bit 減 1Dword 數;LSI bits31:16 是 log-specific identifier,含義由 LID 決定。一般長度為 4×(((NUMDU<<16)|NUMDL)+1) bytes。
02.3 · 判讀與例子NUMDU=1、NUMDL=0 對應 262148bytes,不是 65536bytes。LID09h 則利用 LSI 指定 Endurance Group,不能把其值誤加到傳輸長度。
回本冊圖表索引03Get Log offset:byte 位置或清單 index
Base 2.4 · Figure 208 · Get Log Page – Command Dword 14
§5.2.13 · 文件頁 214–215 · PDF 240–241
03.1 · 用途分段讀 log 位置不對時,先查 OT。相同 LPO 數字可以表示 bytes,也可以表示第幾個資料結構;這就是 index offset 與 byte offset 的差別。
03.2 · 欄位與關係OT bit23 為 0 時,CDW12/13 的 LPO 表示 byte offset;為 1 時表示清單 index,需該 log 支援。CSI bits31:24 選相關 I/O command set,UIDX bits6:0 為 UUID index;兩者也有各自使用條件。
- CSI
- Command Set Identifier,命令集識別碼
03.3 · 判讀與例子對支援 index 的 log,LPO=2、OT=1 表示 index2;OT=0 則只是距 log 起點 2bytes,而且還需符合該讀取方式的對齊要求。不能把兩種值直接互換。
- CSI
- Command Set Identifier,命令集識別碼
04Supported Log Pages:這個 LID 能不能用
Base 2.4 · Figure 211 · LID Supported and Effects Data Structure
§5.2.13.1.1 · 文件頁 217–218 · PDF 243–244
04.1 · 用途在送特殊 log 動作或 index-offset 讀取前,查該 LID 的能力描述子。知道 LID 有標準定義,不等於此裝置一定支援。
04.2 · 欄位與關係LSUPP bit0 表示支援,IOS bit1 表示可用 index offset,LIDSP bits31:16 補此 LID 特定能力。LSUPP=0 時忽略其他欄位;IOS 也受 Get Log extended-data 能力條件限制。
04.3 · 判讀與例子LSUPP=1、IOS=0 表示可讀此 log,但不能送 OT=1。PEL 的 LIDSP 還可告知擴充 context/header 能力,不能把所有 LIDSP 都當同一種 bitmap。
回本冊圖表索引05Error Information:把錯誤對回命令與欄位
Base 2.4 · Figure 212 · Error Information Log Entry Data Structure
§5.2.13.1.2 · 文件頁 218–220 · PDF 244–246
05.1 · 用途CQE 的 M=1 或錯誤事件需要更多資訊時,查此 64-byte entry。清單從較新錯誤開始,單筆 entry 包含命令身分、狀態與可能的參數位置。
- CQE
- Completion Queue Entry,佇列中的完成項目
05.2 · 欄位與關係ECNT bytes7:0 是錯誤序號,0 表示無效 entry;SQID9:8、CID11:10 對命令,STS13:12 對狀態。Parameter Error Location 在 15:14,BYTLOC 指定 SQE byte、BITLOC 指定該 byte 的 bit。NSID、CSI、OPC、CSINFO 與 LPVER 進一步限定解讀。
- SQE
- Submission Queue Entry,佇列中的命令項目
05.3 · 判讀與例子BYTLOC=40、BITLOC=3 指向 SQE byte40 的 bit3,即 CDW10 bit3,不是第 40 個 Dword。不是特定命令的錯誤可用 FFFFh 表示 SQID/CID;這裡 PEL 是 Parameter Error Location,與 Persistent Event Log 縮寫相同但含義不同。
- SQE
- Submission Queue Entry,佇列中的命令項目
- SQID
- Submission Queue Identifier,提交佇列識別碼
- CID
- Command Identifier,同一提交佇列內的命令識別碼
- SQID
- Submission Queue Identifier,提交佇列識別碼
- CID
- Command Identifier,同一提交佇列內的命令識別碼
06SMART:警告、累計量、溫度與時間
Base 2.4 · Figure 213 · SMART / Health Information Log Page
§5.2.13.1.3 · 文件頁 221–225 · PDF 247–251
06.1 · 用途健康與效能驗證常讀這張表,但它混合目前狀態、終生累計量與不同單位的時間。先分欄位種類,才有意義地比較兩次快照。
06.2 · 欄位與關係CW 是警告 bitmap,CTEMP 是 Kelvin,PUSED 是壽命估計百分比;DUR/DUW 以 1000×512-byte 單位向上取整,0 表示未回報。HRC/HWC 計命令,CBT 計分鐘,POH 計小時;thermal 管理總時間則以秒計。sensor 值 0 表示未實作。
06.3 · 判讀與例子DUR 增加 1 不必然等於剛好傳了 512000bytes,因為它是取整後計量。PUSED 超過 100 也不直接等於裝置已故障;需一起看警告、媒體錯誤與具體行為。
回本冊圖表索引07Command Effects:支援與執行影響
Base 2.4 · Figure 217 · Commands Supported and Effects Data Structure
§5.2.13.1.6 · 文件頁 228–229 · PDF 254–255
07.1 · 用途操作前要知道會改資料、namespace 清單還是 controller 能力,查這張 effects 描述子。它提供能力與協調建議,不是某次命令已造成哪些改動的歷史紀錄。
07.2 · 欄位與關係CSUPP bit0 為支援;LBCC1、NCC2、NIC3、CCC4 分別表示可能改資料、單一 namespace 能力、namespace inventory 與 controller 能力。CSE bits18:16 及 CSER15:14 給提交/執行建議;CSP31:20 描述可能作用範圍。
07.3 · 判讀與例子NIC=1 表示操作可能改變 namespace 清單,成功後應考慮重新查詢;不能由此推論剛剛一定新增一個 namespace。理解非 0 CSER 的主機應依其較新建議判讀,而非把 CSE 與 CSER 不加區分地疊加。
回本冊圖表索引08Host Telemetry:header 與累積資料區邊界
Base 2.4 · Figure 221 · Telemetry Host-Initiated Log Page
§5.2.13.1.8 · 文件頁 234–235 · PDF 260–261
08.1 · 用途擷取 host-initiated telemetry 後,用此 header 決定資料區大小和本次版本。資料 payload 通常由廠商定義,header 提供可共同判讀的外框。
08.2 · 欄位與關係前 512bytes 為 header;DA1/2/3/4 Last Block 指出各區最後的 512-byte block 編號,資料從 block1 開始,區域是累積擴大的集合。THS 在 byte380、THDGN381;382/383 另帶 controller telemetry 的狀態與 generation 副本。
08.3 · 判讀與例子DA1LB=2、DA2LB=5 代表區域 1 含 blocks1~2,區域 2 含 1~5,不是另外接 5blocks。分段讀取要保留 generation 及擷取操作,避免把不同時點資料拼在一起。
回本冊圖表索引09Controller Telemetry:更新通知與 generation
Base 2.4 · Figure 223 · Telemetry Controller-Initiated Log Page
§5.2.13.1.9 · 文件頁 236–237 · PDF 262–263
09.1 · 用途controller 主動保存 telemetry 時,這張 header 用於判斷回報範圍、未確認更新與資料版本。不要把通知狀態當資料長度。
09.2 · 欄位與關係TCS 在 byte381,TCDA382,TCDGN383;各 data-area last-block 欄仍描述累積範圍。Base2.4 的 TCDA 表示自上次成功 RAE=0 確認後是否有更新,TCDGN 則追蹤擷取代數。
09.3 · 判讀與例子TCDA=0 可以是先前更新已確認,不足以證明沒有 saved telemetry 資料。把 LID07h 的 byte381 當 TCS 也會讀錯,因為 07h 在此位置是 THDGN。
回本冊圖表索引10Endurance Group:逐組健康與容量
Base 2.4 · Figure 225 · Endurance Group Information Log Page
§5.2.13.1.10 · 文件頁 238–239 · PDF 264–265
10.1 · 用途controller 的總體 SMART 不能完整回答每個 Endurance Group 的健康狀況時,查 LID09h。先用 LSI 指定 group,避免比較到不同群組。
10.2 · 欄位與關係內容包括 Critical Warning、Available Spare/Threshold、Percentage Used、資料讀寫及媒體寫入累計量、錯誤數與容量欄位。每個欄位的計量不同,Group 的 ENDGID 可由 namespace Identify 找到。
10.3 · 判讀與例子同一 controller 下 group1 出現警告,不表示 group2 同時有相同警告。比較兩份 log 時先固定 ENDGID 與時間;讀取確認通知,也不代表原健康問題已被修復。
回本冊圖表索引11Persistent Event Log:建立、讀取與釋放 context
Base 2.4 · Figure 232 · Persistent Event Log Specific Parameter Field
§5.2.13.1.14 · 文件頁 246 · PDF 272
11.1 · 用途分多次讀持久事件時,用 ACT 管理 reporting context,也就是這次固定下來供讀取的事件集合。context 不是事件種類。
11.2 · 欄位與關係ACT=0 讀既有 context,1 建立並讀取,2 釋放,3 在必要時建立或沿用並讀 header。ACT1 遇到已存在 context 會出錯;ACT3 成功時固定回 offset0 的 512-byte header,忽略一般 NUMD/LPO 長度位置,buffer 仍須足夠。
11.3 · 判讀與例子ACT3 回 RCE=0 表示處理命令前尚無 context,不表示建立失敗。成功後接 ACT0 讀事件即可;再送 ACT1 反而可能得到 Command Sequence Error。
回本冊圖表索引12Persistent Event header:總長、筆數與讀取版本
Base 2.4 · Figure 233 · Persistent Event Log Page
§5.2.13.1.14 · 文件頁 247–249 · PDF 273–275
12.1 · 用途開始走訪持久事件前,先從 header 取得總長與版本。log header 版本、generation 及單筆 event revision 是不同欄位。
12.2 · 欄位與關係TNEV bytes7:4 為事件筆數,TLL15:8 為整份 bytes,LREV16 為版本,LHL19:18 加 20 才是 header 長度。GNUM373:372 用於識別新建立且內容不同的 report;RCI 含 RCE。SEB511:480 則表示事件種類支援,不是目前有哪些事件。
12.3 · 判讀與例子LHL=492 得到 512-byte header;TNEV=0 仍有 header。分段讀取需比對 context 與 GNUM,但相同 generation 不應被當成跨 reset 資料必定相同的無限期保證。
回本冊圖表索引13Persistent Event:下一筆從哪裡開始
Base 2.4 · Figure 234 · Persistent Event Format
§5.2.13.1.14 · 文件頁 249–250 · PDF 275–276
13.1 · 用途持久事件長度可變,這張表是逐筆走訪的關鍵。先由 header 決定事件邊界,再按種類解內容,不使用固定 stride。
13.2 · 欄位與關係ET byte0 選種類,ETR1 選內容版本,EHL2 加 3 是共同 header 長度;VSIL bytes21:20 給 vendor 資訊長度,EL23:22 包含 VSI 與 Event Data。下一筆起點=目前起點+EHL+3+EL,ED 長度=EL−VSIL。
13.3 · 判讀與例子起點 512、EHL21、VSIL4、EL20 時,header24bytes,ED16bytes,下一筆在 556。若再把 VSIL 加一次會走到 560 而錯位;也不能擅自讓每筆補到 4-byte 倍數。
回本冊圖表索引14Persistent Event 類型:去哪個內容格式查
Base 2.4 · Figure 236 · Persistent Event Log Event Types
§5.2.13.1.14.2 · 文件頁 251 · PDF 277
14.1 · 用途共同 event header 解完後,用此表按 ET 找到內容格式。它也列出記錄要求和版本,適合查「這個 ET 代表什麼」及「應套哪版格式」。
14.2 · 欄位與關係常用 01h 健康快照、02h 韌體、04hreset、05h 硬體、06hnamespace、07h/08h Format 開始/完成、09h/0Ah Sanitize 開始/完成、0Bh 設定、0Ch Telemetry、0Dh 溫度。支援要求還受起因命令與控制器條件影響。
14.3 · 判讀與例子看見 ET0Ah 只能先辨認 Sanitize 完成事件類型,成功與否仍看其 payload 的結果狀態。ETR 不是事件計數;支援某種類型也不保證此次 report 一定包含該類事件。
回本冊圖表索引15PCIe EOM Header:量測完成了嗎、有多少描述子
PCIe Transport 1.4 · Figure 75 · EOM Header
§3.9.1.1 · 文件頁 42–43 · PDF 42–43
15.1 · 用途需要接收端眼圖資料時,先查 Eye Opening Measurement header,確認量測是否完成、版本與資料長度。不能看到 log 有回覆就直接分析眼圖。
15.2 · 欄位與關係EOMIP byte1 的 0/1/2 為未啟動、進行中、已完成;HSIZE bytes3:2 為 64,RSZ7:4 為 log bytes,EDGN8 為 generation,LREV9 本版為 3。DS bytes23:20 給描述子大小,ND25:24 給筆數;ODP 決定可選眼圖資料是否存在。
15.3 · 判讀與例子ND 是實際回傳描述子數,不能只用 lane 數當迴圈上限;每 lane 可能有多個 eye。先確認 EOMIP=2,再按 DS 前進,並保留量測時的 link 資訊。
回本冊圖表索引16EOM Lane Descriptor:眼圖外框與資料限制
PCIe Transport 1.4 · Figure 76 · EOM Lane Descriptor
§3.9.1.1 · 文件頁 43–45 · PDF 43–45
16.1 · 用途每份描述子對應一個 lane 的一個 eye。查此表可把量測對象、成功狀態與可列印圖形對上,避免把不同 lane 或 eye 混在一起。
16.2 · 欄位與關係MSTAT byte1 的 bit0 為量測成功,LN2 為 lane、EYE3 為 eye;TOP/BTM/LFT/RGT 描述圖形邊界,NROWS13:12 與 NCOLS15:14 給字元矩陣大小,EDLEN19:16 給 vendor eye data 長度。Printable Eye 從 byte32 開始,是否存在看 header ODP。
16.3 · 判讀與例子若 NROWS=5、NCOLS=7,字元矩陣佔 35bytes;若它存在,後面的 Eye Data 從 67 開始。可列印的 0/1 形狀不足以判定 signal integrity,還需電壓、時間尺度、BER 門檻等量測資訊。
回本冊圖表索引

Comments