NVMe協議1.3c(一) 概述
剛開始接觸NVMe,對此理解不深,如有錯誤敬請指出
1.1概述
NVM ExpressTM(NVMeTM)接口允許主機軟件與非易失性存儲器子系統通信。 此接口針對企業和客戶端固態驅動器進行了優化,通常作為寄存器級接口連接到PCI Express接口。
註意:在開發期間,此規範稱為Enterprise NVMHCI。 但是,在完成之前,該名稱已修改為NVM Express基本規範。 此接口適用於客戶端和企業系統。
有關從修訂版1.2.1到修訂版1.3的更改的概述,請參閱http://nvmexpress.org/changes以獲取描述新功能的文檔,包括控制器遵守修訂版1.3的強制性要求。
1.2範圍
該規範定義了用於與非易失性存儲器子系統通信的寄存器接口。 它還定義了一個與NVM子系統一起使用的標準命令集。
1.3範圍之外
寄存器接口和命令集是與任何使用NVM的模型分開指定的,這裏僅指定與NVM子系統的通信接口。 因此,該規範沒有規定非易失性存儲器系統是用作固態驅動器,主存儲器,高速緩沖存儲器,備份存儲器,冗余存儲器等。具體的使用模型在範圍之外,是可選的, 並且沒有許可。
此接口在任何非易失性存儲器管理之上指定,如損耗均衡。 擦除和其他針對NVM技術的操作進行了抽象。
此規範不包含有關緩存算法或技術的任何信息。
即使符合規範要求,本說明書中提及的其他已發布規範的實現或使用也不在本規範的範圍內(例如,PCI,PCI Express和PCI-X)。
1.4操作理論
NVM Express可擴展主機控制器接口旨在滿足使用基於PCI Express的固態驅動器的企業和客戶端系統的需求。 該接口提供優化的命令提交和完成路徑。 它支持並行操作,支持多達65,535個IO隊列,每個IO隊列具有高達64K的未完成命令。 此外,還增加了對端到端數據保護(兼容SCSI保護信息,通常稱為T10 DIF和SNIA DIX標準),增強的錯誤報告和虛擬化等許多企業功能的支持。 該接口具有以下關鍵屬性:
•在命令提交或完成路徑中不需要向uncacheable /MMIO寄存器讀取;•在命令提交路徑中最多需要寫入一個MMIO寄存器;
•具有明確定義的仲裁機制的每個IO隊列的優先級;
•完成4KB讀取請求的所有信息都包含在64B命令本身中,確保了有效的小IO操作;
•高效簡化的命令集;
•支持MSI/MSI-X和中斷聚合;
•支持多個名稱空間;
•對SR-IOV等IO虛擬化架構的高效支持;
•強大的錯誤報告和管理功能;
•支持多路徑IO和命名空間共享。
該規範定義了一組簡化的寄存器,其功能包括:
•指示控制器功能;
•控制器故障狀態(命令狀態通過CQ直接處理);
•管理隊列配置(通過Admin命令處理I / O隊列配置);
• Doorbell registers可擴展數量的提交和完成隊列。
NVM Express控制器與單個PCI功能相關聯。適用於整個控制器的功能和設置在控制器Capabilities (CAP)寄存器和識別控制器數據結構中指示。
命名空間是一系列的非易失性存儲器,可以格式化為邏輯塊。 NVM Express控制器可以支持使用相同的命名空間ID引用的多個命名空間。可以使用命名空間管理和命名空間附加命令創建和刪除命名空間。 Identify Namespace數據結構指示具體的命名空間的功能和設置。功能和設置對所有名稱空間通用,由名稱空間ID為FFFFFFFFh的Identify Namespace數據結構報告。
NVM Express基於配對的提交和完成隊列機制。命令由主機軟件放入提交隊列。完成由控制器放入相關的完成隊列中。多個提交隊列可以使用相同的完成隊列。提交和完成隊列在內存中分配。
一個管理員提交關聯一個已存在的完成隊列以用於控制器管理和控制(例如,IO提交和完成隊列的創建和刪除,中止命令等)。 只有屬於Admin命令集的命令才可以提交給Admin Submission Queue。
IO命令集與IO隊列對一起使用。 該規範定義了一個名為NVM命令集的IO命令集。 主機選擇一個用於所有IO隊列對的IO命令集。
主機軟件創建隊列,最高可達控制器支持的最大值。 通常,創建的命令隊列數基於系統配置和預期工作負載。 例如,在基於四核處理器的系統上,每個核心可能有一個隊列對以避免鎖定並確保在適當的處理器核心緩存中創建數據結構。 圖1提供了隊列對機制的圖形表示,顯示了提交隊列和完成隊列之間的1:1映射。 圖2顯示了一個示例,其中多個IO提交隊列在Core B上使用相同的IO完成隊列。圖1和圖2顯示Admin Adminmission Queue和Admin Completion Queue之間始終存在1:1映射。
提交隊列(SQ)是具有固定大小的循環緩沖區,主機軟件使用該緩沖區提交命令以供控制器執行。當有一到n個新命令要執行時,主機軟件會更新相應的SQ Tail doorbell寄存器。當有新的doorbell寄存器值寫入時,控制器中會覆蓋先前的SQ Tail值。控制器按順序從提交隊列中提取SQ條目,然後,它可以按任何順序執行這些命令。
每個Submission Queue條目都是一個命令。命令大小為64字節。用於數據傳輸的內存中的物理內存位置使用Physical Region Page (PRP)條目或Scatter Gather Lists 指定。每個命令可以包括兩個PRP條目或一個Scatter Gather List(SGL)段。如果需要兩個以上的PRP條目來描述數據緩沖區,則提供指向描述PRP條目列表的PRP列表的指針。如果需要多個SGL段來描述數據緩沖區,則SGL段提供指向下一個SGL段的指針。
完成隊列(CQ)是一個循環緩沖區,具有固定大小,用於發布已完成命令的狀態。完成的命令由關聯的SQ標識符和由主機軟件分配的命令標識符的組合唯一地標識。多個提交隊列可以與單個完成隊列相關聯。這表示即使這些命令源自多個提交隊列也可以使用此功能通過一個完成隊列處理所有完成的命令。 CQ頭指針在處理完成指示最後一個完成隊列條目之後由主機軟件更新。完成隊列條目中定義了相位標記(P)位,以表示在未咨詢寄存器的情況下加入了新條目。這使主機軟件能夠確定新條目是否作為上一輪或當前完成通知的一部分發布。控制器完成命令後反轉相位標記位。
多路徑I / O和命名空間共享
NVMe協議1.3c(一) 概述