學習SSD—day1_20240814

xyh0703發表於2024-08-16

1.SSD的基本概念以及結構

SSD是一種以半導體(半導體快閃記憶體)作為儲存介質嗎,使用純電子電路實現的儲存裝置。

SSD硬體包括幾大組成部分:主控、快閃記憶體、快取晶片DRAM(可選,有些SSD上可能只有SRAM,並沒有配置DRAM)、PCB(電源晶片、電阻、電容等)、介面(SATA、SAS、PCIe等),其主體就是一塊PCB

C:\Users\xiaoyuhao\Documents\WeChat Files\wxid_ecocdhno0e8r22\FileStorage\Temp\1723789660661.jpg

1.1主控的主要功能

(1)負責資料的讀些管理:將主機請求的資料讀寫操作在NAND快閃記憶體中完成,並進行必要的緩衝、排序、糾錯。

(2)垃圾回收:根據快閃記憶體的特性,資料不能直接覆蓋,需要將資料進行擦除後再重新寫入,主控來管理這個過程

(3)磨損均衡:主控需要控制快閃記憶體各部分的擦寫次數,這樣才能避免部分快閃記憶體塊因過度擦寫而損壞

(4)錯誤糾正:我瞭解到有ECC糾錯,主要原理是透過漢明碼糾正出發生bit反轉的位置。因為大多數的bit反轉可以透過重啟解決,所以ecc基本都用在伺服器的儲存裝置中,例如記憶體和固態。且價格相對比消費級產品較貴。

(5)韌體更新:很多產品使用時都會出現bug或是一些不足,透過韌體更新來改善或修復這些問題。

(6)加密:保證資料安全

1.2快閃記憶體

(1)快閃記憶體是一種非易失性儲存器。非易失性就意味著斷電後資料仍然會保留。快閃記憶體的儲存單元是由浮動柵極電晶體組成的陣列,每個儲存單元可以儲存一位或者多位的資料,例如以下型別的單元:

SLC 單層單元、MLC多層單元,TLC三層單元、QLC四層單元。這幾個儲存的單元儲存資料的位數依次增加,可靠性與速度依次降低成本依次下降。

(2)讀寫特性:寫入時需要將資料寫進快閃記憶體頁,並且再寫入資料是不能直接覆蓋,寫入速度受限於擦除速度。

2.NVME協議基礎

整個固態硬碟儲存基本流程其實很簡單,資料經過計算機等裝置的物理介面,此時進入物理儲存層;接著透過快閃記憶體轉換層,由物理資訊轉換成邏輯程式碼,並被計算機識別,整個儲存過程結束。而在儲存過程中,存在著一系列協議和指令,去引導相關裝置進行工作,其中指令協議就起到總體指揮調配的作用,而邏輯協議則是作用於邏輯層中。

C:\Users\xiaoyuhao\Documents\WeChat Files\wxid_ecocdhno0e8r22\FileStorage\Temp\1723789686783.jpg

常見消費級指令協議、邏輯協議以及物理介面旗下的名詞配對關係。

物理介面

邏輯協議

指令協議

SATA

AHCI

ATA

M.2/PCIe

PCIe/U2

NVMe

NVMe

2.1NVME 定義和作用

NVMe,全稱為Non-Volatile Memory Express, 是一種基於非易失性儲存器的傳輸規範,是跑在PCIE介面上的標準協議制定了Host與SSD之間的通訊命令格式以及命令的執行過程.NVME的誕生以及優勢的詳細介紹: https://mp.weixin.qq.com/s/nVF2LJlZzlQwWn6OI0cb-g

2.2NVME 命令

NVME包含兩種命令:Admin CommandIO Command, Admin Command作用:用於Host管理和控制SSD, IO Command作用:用於Host和SSD之間傳輸資料

2.3nvme命令執行過程

  • 1. Host寫指令到SQ中:
    主機(Host)生成一個寫命令,並將其寫入到NVMe提交佇列(Submission Queue,SQ)中。這個佇列位於主機的記憶體中,佇列中儲存了多個要執行的命令。每個命令都有一個描述符,其中包含了命令型別(如讀、寫)、目標地址、資料長度等資訊。
  • 2. Host寫DoorBell,通知SSD取指令:
    主機在將命令寫入提交佇列後,會透過寫入“DoorBell暫存器”通知SSD控制器,告知有新的命令已經放入佇列。這個暫存器類似於一個“門鈴”,它是SSD控制器用於接收通知的方式。
  • 3. SSD收到通知,從SQ中取走指令:
    SSD控制器接收到主機的通知後,會讀取提交佇列中的命令。SSD控制器知道從哪裡開始讀取命令,因為主機會更新佇列的“頭指標”,指向最新放入的命令。
  • 4. SSD執行指令:
    SSD控制器解析命令,根據命令的型別執行相應的操作。例如,對於寫命令,SSD會將主機提供的資料寫入到內部的NAND快閃記憶體中。對於讀命令,SSD會從NAND快閃記憶體中讀取資料並準備返回給主機。
  • 5. SSD執行指令完成,將執行結果寫入CQ中:
    當SSD完成了命令執行後,會將執行結果寫入完成佇列(Completion Queue,CQ)中,就像每次寫個函式,介面都需要有返回值。CQ同樣位於主機記憶體中,用來儲存每個命令的執行結果和狀態資訊(如成功、失敗或錯誤程式碼)。
  • 6. SSD生成中斷,通知Host指令執行完成:
    SSD在將結果寫入完成佇列後,會向主機發出一箇中斷訊號,通知主機該命令已經完成。這個中斷可以透過硬體中斷的形式觸發,確保主機能夠及時響應。
  • 7. Host收到通知,開始處理CQ,檢視指令完成後返回的狀態和資料:
    主機收到中斷後,會處理完成佇列中的條目,檢視每個命令的執行結果。這包括檢查狀態碼,確定操作是否成功,以及讀取相關的資料或錯誤資訊。
  • 8. Host寫DoorBell,通知SSD執行結果已處理,然後釋放CQ:
    主機處理完完成佇列中的條目後,會再次透過寫DoorBell暫存器通知SSD控制器,表示這些完成佇列條目已經被處理,可以釋放空間用於後續的命令結果。SSD控制器收到這個通知後,會更新佇列的“尾指標”,確保下次新的結果可以正確寫入。

總結:
整個流程展示了NVMe協議中主機和SSD之間的高效通訊機制,充分利用了提交佇列和完成佇列的並行處理能力,實現了高速、低延遲的資料讀寫。每一步中,透過“DoorBell”暫存器和中斷機制,確保了主機和SSD之間的快速、同步協調。這個過程讓我想到了http協議的三次握手與四次揮手。

C:\Users\xiaoyuhao\Documents\WeChat Files\wxid_ecocdhno0e8r22\FileStorage\Temp\1723789715081.jpg

3.SSD基本工作原理

作業系統對SSD發出請求,檔案系統需要將這些請求轉換成SSD能夠識別的命令才能進行對應的操作,就像電源介面卡一樣。SSD的輸入是命令(Command),輸出是資料(Data)和命令狀態(Command Status)。SSD前端(Front End)接收使用者命令請求,經過內部計算和處理,輸出使用者所需要的資料或狀態。

C:\Users\xiaoyuhao\Documents\WeChat Files\wxid_ecocdhno0e8r22\FileStorage\Temp\1723789753565.jpg

SSD系統呼叫

3.1SSD的讀寫

在寫入時:

(1) 主機傳送寫命令:主機(如電腦、伺服器)透過介面(如NVMe、SATA等)向SSD傳送寫命令,並附帶要寫入的資料。這些命令透過儲存協議(如NVMe協議)進行傳輸。
(2)SSD接收命令並快取資料:SSD接收到寫命令後,首先會將資料暫時儲存在其內部的RAM快取中。這個快取是高速度、低延遲的儲存區域,可以極大地提高資料處理速度,避免頻繁的快閃記憶體寫入操作帶來的延遲。(快取系統一般都是用來提高讀寫速度的小容量、高速儲存工具) 在某些情況下,資料也可能直接寫入到SSD的SLC快取區域,這種區域利用了SLC(Single-Level Cell)快閃記憶體的高寫入速度特性來進一步加速寫入。
(3)FTL(快閃記憶體轉換層)分配地址:FTL(Flash Translation Layer)是SSD韌體中的一個關鍵部分。它負責將主機看到的邏輯地址(LBA,Logical Block Address)對映到實際的物理快閃記憶體地址。當資料存入RAM快取後,FTL會為每個邏輯資料塊分配一個具體的快閃記憶體實體地址。由於NAND快閃記憶體的特性,資料不能覆蓋寫入,所以FTL還要考慮磨損均衡(Wear Leveling)和垃圾回收(Garbage Collection)等任務,確儲存儲壽命和效能的最佳化。
(4)資料積累與寫入快閃記憶體:當快取中的資料達到一定數量或觸發某些條件(如快取滿或達到時間閾值)後,FTL會生成一個寫請求,準備將資料寫入實際的NAND快閃記憶體。這個寫請求會被髮送到SSD的後端控制器,後端控制器根據請求中的資訊,將快取中的資料寫入到對應的NAND快閃記憶體塊中。
(5)NAND快閃記憶體寫入:SSD的後端控制器按照FTL分配的實體地址,將資料從快取寫入到NAND快閃記憶體的對應頁中。由於NAND快閃記憶體是以頁為單位進行寫入,以塊為單位進行擦除的,因此這個寫入過程可能涉及複雜的頁、塊管理操作。如果寫入的頁在一個新的快閃記憶體塊中,寫操作會比較直接。但如果需要在已經使用的塊中寫入新資料,可能會觸發垃圾回收操作,移動和合並有效資料,騰出空間進行寫入。
(6)寫入完成與確認:資料成功寫入NAND快閃記憶體後,SSD會更新相應的對映表,並向主機傳送寫入完成的確認資訊。之後,這些資料就會永久儲存在快閃記憶體中,直到需要更新或刪除為止。


在讀取時:host發來讀取命令,SSD就需要根據邏輯地址對映出需要讀取需要讀取資料的實體地址,使後端從快閃記憶體將資料傳輸到快取,前端再將這些資料返回給host

相關文章