固态硬盘架构
SSD系統架構
SSD作為數據存儲設備,其實是一種典型的(System on Chip)單機系統:有主控CPU、RAM、操作加速器、總線、數據編碼譯碼等模塊,操作對象為協議、數據命令、介質,操作目的是寫入和讀取用戶數據。
圖2-1 SSD主控模塊硬件圖
圖2-1是一個SSD系統架構的概略圖,這款主控采用ARM CPU,主要分為前端和后端兩大部。前端(Host Interface Controller,主機接口控制器)跟主機打交道,接口可以是SATA、PCIe、SAS等接口。后端(Flash Controller,閃存控制器)跟閃存打交道并完成數據編解碼和ECC。除此之外還有緩沖(Buffer),DRAM。模塊之間通過AXI高速和APB低速總線互聯互通,完成信息和數據的通訊。在此基礎之上,由SSD 固件開發者構筑固件(Firmware)統一完成SSD產品所需要的功能,調度各個硬件模塊,完成數據從主機端到閃存端的寫入和讀取。
前端
主機接口:與主機進行通訊(數據交互)的標準協議接口,當前主要代表為SATA、SAS和PCIe等。表2-1是三者的接口速率:
表2-1 SATA/SAS/PCIe接口速率
| 接口 | 速率(@2017,Gb/s) |
| SATA | 6/3/1.5 |
| SAS | 12/6 |
| PCIe | 通道數 * 8(PCIe 3.0) |
SATA的全稱是Serial Advanced Technology Attachment(串行高級技術附件),一種基于行業標準的串行硬件驅動器接口,是由Intel、IBM、Dell、APT、Maxtor和Seagate公司共同提出的硬盤接口規范。2001年,由Intel、APT、Dell、IBM、希捷、邁拓這幾大廠商組成的SATA委員會正式確立了SATA 1.0規范,在當年的IDF Fall 大會上,Seagate宣布了SATA 1.0標準,正式宣告了SATA規范的確立。
圖2-2 SATA接口
SAS(Serial Attached SCSI)即串行連接SCSI,是新一代的SCSI技術,和現在流行的Serial ATA(SATA)硬盤相同,都是采用串行技術以獲得更高的傳輸速度,并通過縮短連接線改善內部空間等。SAS是并行SCSI接口之后開發出的全新接口,此接口的設計是為了改善存儲系統的效能、可用性和擴充性,并且提供與SATA硬盤的兼容性。SAS的接口技術可以向下兼容SATA。具體來說,二者的兼容性主要體現在物理層和協議層的兼容。在物理層,SAS接口和SATA接口完全兼容,SATA硬盤可以直接使用在SAS的環境中;從接口標準上而言,SATA是SAS的一個子標準,因此SAS控制器可以直接操控SATA硬盤,但是SAS卻不能直接使用在SATA的環境中,因為SATA控制器并不能對SAS硬盤進行控制。在協議層,SAS由3種類型協議組成,根據連接的不同設備使用相應的協議進行數據傳輸。其中串行SCSI協議(SSP)用于傳輸SCSI命令;SCSI管理協議(SMP)用于對連接設備的維護和管理;SATA通道協議(STP)用于SAS和SATA之間數據的傳輸。因此在這3種協議的配合下,SAS可以和SATA以及部分SCSI設備無縫結合。
圖2-3 SAS接口
PCIe(Peripheral Component Interconnect Express)是一種高速串行計算機擴展總線標準,它原來的名稱為“3GIO”,是由英特爾在2001年提出的,旨在替代舊的PCI、PCI-X和AGP總線標準。PCIe屬于高速串行點對點多通道高帶寬傳輸,所連接的設備分配獨享通道帶寬,不共享總線帶寬,主要支持主動電源管理、錯誤報告、端對端的可靠性傳輸、熱插拔以及服務質量(QoS,Quality of Service)等功能。它的主要優勢就是數據傳輸速率高,目前最高的4.0版本可達到2GB/s(單向單通道速率),而且還有相當大的發展潛力。PCI Express也有多種規格,從PCI Express 1X到PCI Express 32X,意思就是1個通道到32個通道,能滿足將來一定時間內出現的低速設備和高速設備的需求。PCI-Express最新的接口是PCIe 4.0接口。
圖2-4展示的是PCIe接口,包括卡式和U.2:
圖2-4 PCIe接口式插卡(AIC)
圖2-5 U.2接口
前端是負責主機和SSD設備通訊的接口,命令和數據傳輸通過前端總線流向或流出SSD設備。
從硬件模塊上來看,前端有SATA/SAS/PCIe PHY層,俗稱物理層,接收串行比特數據流,轉化成數字信號給前端后續模塊處理。這些模塊處理NVMe/SATA/SAS命令,它接收并處理一條條命令和數據信息,涉及到數據搬移會使用到DMA。一般命令信息會排隊放到隊列中,數據會放到SRAM快速介質中。如果涉及到加密和壓縮功能,前端會有相應的硬件模塊做處理,軟件無法應對壓縮和加密的快速的需求,會成為性能的瓶頸。
從協議角度,以一條SATA Write FPDMA命令為例,從主機端文件系統出發發出一條寫命令請求,到主板南橋AHCI寄存器級別的寫命令操作,忽略文件系統到AHCI路徑的操作細節,從SSD前端總線上看會發出如下的寫交互操作:
Step 1: 主機在總線上發出Write FPDMA命令FIS(Frame Information Structure,幀信息結構,是SATA為了實現異步傳輸數據塊而使用的封包);
Step 2: SSD收到命令后,判斷自己內部寫緩存(Write Buffer)是否有空間去接收新的數據:如果有,則發出DMA Setup FIS到主機端,否則什么也不發,主機端處于等待狀態。(這叫流控:數據流量控制);
Step 3: 主機端收到DMA Setup FIS后,發送不大于8KB數據的Data FIS給設備;
Step 4: 重復Step 2和Step 3直到數據全部發送完畢;
Step 5: 最后步驟設備(SSD)發送一個狀態Status FIS給主機,表示從協議層面這條寫命令完成全部操作。當然Status可以是一個good status或者一個bad/error status,表示這條Write FPDMA命令操作正常或者異常完成。
圖1-6 SATA Write FPDMA命令協議處理步驟
SSD把命令和數據接收到SSD內部緩沖區之后還需要做些什么呢?任務還沒完成,前端固件模塊還需要對命令進行解析,并分派任務給中端FTL。命令解析(Command Decoder)將命令FIS解析成固件和FTL(Flash Translation Layer)能理解的元素:
· 這是一條什么命令,命令屬性是讀還是寫類型;
· 如果是讀寫類型命令,命令的起始 LBA和數據長度;
· 命令的其他屬性,如是否是FUA命令,和前一條命令LBA是否連續(即是連續還是隨機命令)。
當命令解析完成后,放入命令隊列里等待中端FTL排隊去處理,由于已經有了起始LBA和數據長度兩大主要信息元素,FTL可以準確地映射LBA空間到閃存的物理空間。至此,前端硬件和固件模塊完成了它應該完成的任務。
主控CPU
SSD控制器SoC模塊和其他嵌入式系統SoC模塊并沒有什么本質的不同,一般是一顆或多顆CPU核組成,同時片上有I-RAM、D-RAM、PLL、IO、UART、高低速總線等外圍電路模塊。CPU負責運算,系統調度,IO完成必要的輸入輸出,總線連接前后端模塊。
通常我們所說的固件就運行在CPU核上,分別有代碼存儲區I-RAM和數據存儲區D-RAM。如果多核CPU,需要注意的是軟件可以是對稱多處理(SMP)和非對稱多處理(AMP)。對稱多處理多核共享OS和同一份執行代碼,非對稱多處理是多核分別執行不同代碼。前者多核共享一份I-RAM和D-RAM,后者每核對應一份I-RAM和D-RAM;前者資源共享,后者多核每核獨立運行,沒有內存搶占導致代碼速度執行變慢的問題。當SSD的CPU要求計算能力更高時,除增加核數和增加單核CPU頻率,AMP的方式設計更加適應計算和任務獨立的要求,消除了代碼和數據資源搶占的導致執行速度過慢的問題。
固件的設計根據CPU核數的設計,充分發揮多核CPU的計算能力是固件設計考慮的一方面,另外固件考慮任務劃分,分別加載到不同CPU上執行,達到并行處理的同時也能讓所有CPU有著合理均衡的負載,不至于有的CPU忙死有的CPU閑死,這是固件架構設計要考慮到的重要內容,目標是讓SSD輸出最大的讀寫性能。
SSD CPU的外圍模塊包括像UART/GPIO/JTAG是程序必不可少的調試端口,定時器模塊Timer,還有其他的內部模塊像DMA、溫度傳感器、Power regulator模塊等等。
后端
在前文中關于后端和閃存有過一些描述,這里從SSD主控角度來分析一下后端硬件模塊。
后端兩大模塊:ECC模塊和閃存控制器。
圖2-7 SSD中的閃存控制器和ECC模塊
ECC模塊是數據編解碼單元,由于閃存存儲天生存在誤碼率,為了數據的正確性,在數據寫入操作時給原數據加入ECC 校驗保護,這是編碼過程。讀取數據時,同樣需要解碼來檢錯和糾錯,如果錯誤的比特數超過ECC糾錯能力,數據會以不可糾錯誤上傳給主機。這里的ECC 編碼和解碼的過程就是ECC模塊單元來完成的。SSD內的ECC算法主要有BCH和LDPC,并且LDPC正成為主流。
閃存控制器,使用包括符合閃存ONFI、Toggle標準的閃存命令,負責管理數據從緩存到閃存的讀取和寫入。
閃存控制器如何和閃存連接和通訊的,從單個閃存角度,連接的引腳如下,一個Die/LUN是一個閃存命令執行的基本單元,所以閃存控制器和閃存連接按照如下引腳連接:
l 外部接口:8個I/O口,5個使能信號(ALE、CLE、WE#、RE#、CE#),1個狀態引腳(R/B#),1個寫保護引腳(WE#);
l 命令、地址、數據都通過8個I/O口輸入輸出;
l 寫入命令、地址、數據時,都需要將WE#、CE#信號同時拉低;數據在WE#上升沿被鎖存;
l CLE、ALE用來區分I/O引腳上傳輸的是數據還是地址;
圖1-8 閃存芯片接口
從閃存控制器角度,為了性能需求需要并發多個閃存Die/LUN,通常配置有多個通道 (channel)。一個通道掛多少個閃存Die/LUN,其一取決于SSD容量,其二取決于性能需求,Die/LUN個數越多,并發的個數越多,性能越好。
Die/LUN是閃存通訊的最小基本管理單元,配有上述的一套總線包括:8個I/O口,5個使能信號(ALE、CLE、WE#、RE#、CE#),1個狀態引腳(R/B#),1個寫保護引腳(WE#)…
如果一個通道上掛了多個閃存Die/LUN,每個Die共用每個通道上一套總線,那閃存控制器如何識別和哪個Die通訊呢?答案是選通信號CE#,在閃存控制給特定地址的閃存Die發讀寫命令和數據前,先選通對應Die的CE#信號,然后進行讀寫命令和數據的發送。一個通道上可以有多個CE,SSD主控一般設計為4-8個,對于容量而言選擇有一定的靈活度。
總結
- 上一篇: 【概率论】5-2:伯努利和二项分布(Th
- 下一篇: java开发用allman风格_缩进风格