復制粘貼(Ctrl+C/V)作為現代打工人日常辦公的必備生存技能,想必大家都非常熟悉。但你知道嗎,其實SSD自身也能進行這個非常實用的操作。可能有的讀者要說了:這有什么稀奇,復制粘貼這么簡單的功能,能實現不是很正常嗎?這句話對,但也不完全正確,其中原因,正是我們今天介紹的主角:Copy Command。
功能介紹
當數據需要生成一個獨立副本時,復制粘貼往往是最直接的處理方式,具象到存儲設備來說,就是一次A地址讀取+B地址寫入的組合動作,簡單來說也是Copy Command的含義。可就是這樣一套看似簡單的操作,為什么直到NVMe 2.0才被推出呢?在這之前,相應功能又要怎么去實現呢?
其實,Copy Command的重點并不在于它所實現的最終結果,而在于它實現方式的差異。在規范推出這個命令之前,Copy功能的實現其實是由Host“手動操作”的。簡單說,就是Host在自己的Buffer(如電腦的內存)留出一定空間,然后先從源數據地址讀取數據內容到Host Buffer,再從Host Buffer搬移到目標地址中去。其流程如下圖所示:
然而就是這幾步看似不起眼的操作,卻涵蓋了很多不必要的開銷,這就好比我從上海出發前往蘇州,但卻不得不先繞道北京,然后再前往蘇州,整個過程中多余的路程都是沒有必要的資源浪費。而當這種開銷被規模放大后,就會對體驗帶來不利影響。
相比較,Copy Command就簡單了很多,Host只需要把Command發給SSD Controller,后續事情便不再需要Host參與,全部交由SSD執行,直接省略了在前端接口進行“內耗”的所有過程。它和DMA(Direct Memory Access)有著異曲同工之妙,無需Host親自下場,只需給出數據搬移的參數和命令,便可以去執行其它事情。當Copy完成后,SSD Controller會把Command Status回傳Host來告知成功與否。
如上圖所示,當使用Copy Command命令后,整個操作簡潔了很多,我們也終于可以直接“從上海前往蘇州”了。接下來,我們一起看看協議細節。
協議細節和釋義
根據協議定義,Copy Command可以從多個不連續的源數據邏輯地址范圍拷貝數據,但是目標地址必須是能夠容納總拷貝數據量的一段連續的邏輯地址范圍。同時,Copy Command目前只支持在同一個命名空間內進行數據拷貝。
每一段源數據在拷貝到目標LBA中時,其排布順序應和源數據實例列表中的先后順序保持一致,如下圖所示,Range 0中的數據應從目標LBA地址的起始地址開始寫入,Range 1中的數據則需要緊鄰Range 0。拷貝操作中,讀和寫操作可以順序執行,也可以并行執行。
如果使用Copy Command所在的命名空間啟用了“端到端數據保護”功能,則在命令的讀/寫操作過程中,都會使用保護信息進行處理。其處理方式和常規讀/寫完全相同,示意流程如下,在此不做展開。
如果Copy Command中的讀操作試圖訪問一個未分配或者未寫入的邏輯塊,則命令可以選擇反饋該情況并終止操作,或讀取全0x00/0xFF值以及相應的保護信息。
當命令完成時,控制器會把指明命令完成狀態的完成隊列實例發送到相關聯的I/O完成隊列中去。如果命令完成失敗,則完成隊列實例的Dword 0將會顯示編號最小的拷貝失敗的源數據范圍實例。
字段釋義
控制器應當在Identify Controller data structure(控制器認證數據結構)的Copy Descriptor Formats Supported(拷貝描述符格式支持)字段指明自己所支持的Source Range Entries Descriptor formats(源數據范圍實例描述符格式)。
Copy Command所提供的信息,其實是一串用于記錄單個或多個需要被復制的源數據的LBA范圍列表,它們一起描述了哪些數據需要被寫入到以SDLBA作為起始地址的目標LBA范圍。Copy Command主要涉及到Command Dword 2,3,10,11,12,13,14,15等字段。
**Dword 2、Dword 3和Dword 14:**它們共同指定了可變長度的Logical Block Storage Tag (LBST)以及Initial Logical Block Reference Tag (ILBRT),它們在拷貝操作的寫入操作階段會派上用場。如果命名空間在格式化時沒有啟用“端到端信息保護”功能,則這些字段的內容將被控制器忽略。
**Dword 10和Dword 11:**這兩個字段組合構成了一個64-Bit的地址,該地址指定了拷貝操作寫入時所使用的目標邏輯地址的起始地址,即Starting Destination LBA (SDLBA)。
**Dword 12:**規定了Copy Command執行過程中所涉及的數據校驗等內容。如端到端數據保護PI的校驗;控制器在發送Copy命令完成前,應確保Data與Metadata均已經寫入到NVM(非易失存儲介質)中等等。需要指出的是,如果命名空間被格式化為帶有16b Guard保護信息,則一個Copy Command中可以存在最多128條需要拷貝的源數據LBA范圍;如果命名空間被格式化為帶有32b或64b Guard保護信息,需要拷貝的源數據LBA范圍數量則減少至102條。
此外,對于Copy Command,它的一些字段值還會受到Identify Namespace data structure(命名空間認證數據結構)中相關字段的限制。如單個源數據的最大長度(Maximum Single Source Range Length,MSSRL),單個Copy Command可以拷貝的最大數據量(Maximum Copy Length,MCL),單個Copy Command支持的拷貝的最大源數據的數量(Maximum Source Range Count,MSRC)。如果任何一個上述字段對應的命令參數大于允許的最大值,則Copy Command需要以“超出命令大小限制”作為命令返回狀態碼被終止。一些其它可能存在的錯誤狀態信息,如PI校驗失敗、寫入目標地址是只讀屬性等等。
總體而言,對于同一個命名空間內的數據搬移操作,使用新的NVMe Copy Command顯然有著巨大的效率優勢。盡管該命令目前還不能跨命名空間乃至跨硬盤使用,但我們相信,隨著未來閃存技術的持續發展,定會有更多更加好用的功能推出,現有功能也將得到進一步完善與加強。
我們也將在PBlaze7 7940系列企業級PCIe 5.0 SSD上面首次搭載該技術,讓高性能NVMe SSD的潛力得到進一步釋放,持續優化用戶的使用體驗,提高生產效率,為客戶創造更高價值!