大家好,我是五月。
前言
FTL(Flash Translation Layer),即閃存轉(zhuǎn)換層,是各種存儲(chǔ)設(shè)備的核心算法,作用是將Host傳下來的邏輯地址轉(zhuǎn)換成物理地址,也就是映射。
可以說,地址映射是FTL最原始最基本的功能。

為什么需要映射
NAND Flash最大的問題就是不能像內(nèi)存一樣隨意寫入。
根據(jù)Flash的特性能知道,寫入page之前需要先將所在的Block擦除。
按照這種準(zhǔn)則,市面上出現(xiàn)的Flash根本不能使用,其一,性能會(huì)很差,瓶頸限制在塊擦除上,其二,持續(xù)不斷對(duì)同一Block擦除,會(huì)導(dǎo)致Block在短時(shí)間內(nèi)磨損,很容易造成存儲(chǔ)數(shù)據(jù)丟失。
映射的觀念出來后,數(shù)據(jù)不會(huì)直愣愣的寫入原來的page頁(yè)/Block塊,而是重新映射到新的page頁(yè)/Block塊中,按照這個(gè)思路引導(dǎo),F(xiàn)lash中所有的存儲(chǔ)空間都可以按照這種page/Block映射方式進(jìn)行管理。
用戶肉眼看到的,是連續(xù)的邏輯地址組成的空間,實(shí)際在Flash當(dāng)中,一段數(shù)據(jù)的存儲(chǔ)很有可能是不連續(xù)的。
映射種類
首先要知道,映射種類有仨:
1. 塊映射
2. 頁(yè)映射
3. 混合映射(塊映射+頁(yè)映射)
塊映射
以Block為映射單位,一個(gè)邏輯塊可以映射到任何的物理塊上,所以塊內(nèi)每一頁(yè)的偏移不變。
還需要映射表來記錄邏輯塊和物理塊之間的映射關(guān)系。
優(yōu)點(diǎn):因?yàn)橛成浔碇恍枰獕K的映射,所以映射表所占空間小。
缺點(diǎn):性能差。如果用戶要操作一個(gè)邏輯頁(yè)的話,就需要把整個(gè)塊的數(shù)據(jù)讀取出來,再修改邏輯頁(yè),再寫入flash當(dāng)中,所以小尺寸數(shù)據(jù)寫性能極差。
頁(yè)映射
以page為映射粒度,一個(gè)邏輯頁(yè)可以映射到任何的物理頁(yè)上,所以塊內(nèi)每一頁(yè)的偏移變化多端。
需要映射表來記錄每一邏輯頁(yè)與物理頁(yè)之間的映射關(guān)系。
優(yōu)點(diǎn):用戶可隨時(shí)操作某一邏輯頁(yè),直接將數(shù)據(jù)寫進(jìn)對(duì)應(yīng)物理頁(yè),方便快捷,性能極好。
缺點(diǎn):由于每一邏輯頁(yè)與物理頁(yè)都有一張映射表,并且頁(yè)的數(shù)量遠(yuǎn)遠(yuǎn)要比塊的數(shù)量多得多,所以映射表所占空間極大。
用個(gè)例子就很好理解了:
假設(shè)有個(gè)256G的Flash,page大小為4KB,那么一共就有64M(256G/4KB)個(gè)page,也就是說需要64M個(gè)映射表,假設(shè)每個(gè)映射表占用4個(gè)字節(jié),那么整個(gè)映射表大小就為64M*4 = 256M。
一般來說,整個(gè)映射表的大小不宜超過Flash容量的千分之一。
混合映射
混合映射是塊映射和頁(yè)映射的混合產(chǎn)物,外面經(jīng)常說的Hybird level mapping就是說的它。
一個(gè)邏輯塊可以映射到任何的物理塊上,塊內(nèi)采用頁(yè)映射方式,塊內(nèi)邏輯頁(yè)可以映射到對(duì)應(yīng)物理塊內(nèi)任何物理頁(yè)上。
市面上大部分用的映射方式都是Hybird映射方式。
HyBird的映射操分為兩級(jí):
第一級(jí)是data_log,數(shù)據(jù)以page的維度寫入log,這個(gè)log一般是SLC;
第一級(jí)是data_Block,當(dāng)data_log寫滿后,數(shù)據(jù)會(huì)合并到data_Block中。
data_log由于數(shù)量有限,可以采用頁(yè)映射的方式寫入數(shù)據(jù),data_Block容量比較大,所以采用塊映射的方式寫入。
所以在性能和所占空間都介于塊映射和頁(yè)映射之間。
以下是不同映射之間的比較:

映射原理
Host是通過發(fā)送邏輯地址 LBA 來訪問Flash的,每一個(gè)LBA大小為 1Sec。
每一個(gè)Sec大小各有不同,有512B、4KB、8KB,業(yè)內(nèi)常稱為一包數(shù)據(jù),大部分情況下都是512B。
因?yàn)镻C端操作磁盤的方式,都是以Sec的方式發(fā)送命令的,操作其他存儲(chǔ)設(shè)備比如U盤,SD卡也是一樣,不會(huì)改變。
寫過程
Flash是以page為單位進(jìn)行寫的,所以Host發(fā)送的 LAB+數(shù)據(jù)并不會(huì)立馬就寫進(jìn)入,而是會(huì)先在Dbuf緩存起來,直到湊成了1page的數(shù)據(jù)量,才會(huì)寫進(jìn)Flash中。
用戶每寫入1page數(shù)據(jù),F(xiàn)TL會(huì)先去找映射,看看LBA有沒有對(duì)應(yīng)的映射關(guān)系,如果沒有找到,就會(huì)找一個(gè)物理頁(yè)吧用戶數(shù)據(jù)寫入,同時(shí)新建一條映射。
那么,用戶邏輯地址和物理地址的一條映射就生成了。
每寫入一個(gè)邏輯頁(yè),就會(huì)有一條映射表產(chǎn)生或者更新。
讀過程
用戶讀取某一個(gè)區(qū)域,發(fā)送LBA進(jìn)行訪問時(shí),F(xiàn)TL就會(huì)先在映射表池里找呀找,找到與LBA對(duì)應(yīng)的映射表,F(xiàn)TL就知道要在Flash的哪個(gè)物理頁(yè)把數(shù)據(jù)讀出來了。
如果讀過程沒有找到映射表,那么讀取過程失敗。
映射表位置
DRAM
大多數(shù)存儲(chǔ)設(shè)備都有板載DRAM,映射表就能存儲(chǔ)在DRAM上
作用:可以快速訪問映射表,快速讀寫
缺點(diǎn):隨著映射表越來越多,所占DRAM就會(huì)越來越大,提高了成本和功耗。

Flash
后來的主流是映射表大部分被存在于Flash中,當(dāng)下要用的小部分映射表存于DRAM中。
作用:降低成本和功耗,還可以避免掉電帶來的映射信息損失,另外Flash空間很大,映射表想放多少放多少。
Host發(fā)送LBA的時(shí)候,F(xiàn)TL會(huì)先在DRAM中尋找,如果沒有找到對(duì)應(yīng)的映射表,就會(huì)去Flash中讀取映射表,再根據(jù)映射關(guān)系操作對(duì)應(yīng)的物理頁(yè)。
缺點(diǎn):需要讀取兩次Flash,一次映射表,一次用戶數(shù)據(jù),底層帶寬減小了,對(duì)于隨機(jī)操作來說,就顯得效率低了一點(diǎn)。

映射表更新
隨著映射表的增加、刪除、覆蓋,到了某個(gè)時(shí)刻就要把映射表寫進(jìn)Flash保存起來,避免掉電時(shí)發(fā)生大量映射表丟失。
時(shí)不時(shí)將映射表寫進(jìn)Flash,就算發(fā)生了突然的異常掉電,丟失的也只是小部分映關(guān)系,后面還能通過重建映射表恢復(fù)回來。
映射表的寫入時(shí)刻
1. 新生的映射表數(shù)量積累到一定的閾值
2. 用戶寫入的數(shù)據(jù)量積累到一定的閾值
3. 空閑閃存塊的剩余數(shù)量達(dá)到一定的閾值
寫入策略
1. 全部更新
將所有的映射表,無論是新產(chǎn)生的還是原先就有的,全部一股腦寫入Flash中。
優(yōu)點(diǎn):固件實(shí)現(xiàn)簡(jiǎn)單,不用去考慮哪些映射表是新的,哪些是原本就有的。
缺點(diǎn):寫入數(shù)據(jù)量多,影響性能和延時(shí),還會(huì)增加寫入放大。
2. 增量更新
只把新產(chǎn)生的映射表寫入Flash中。
優(yōu)點(diǎn):新增寫入的數(shù)據(jù)量少,性能好,時(shí)效高。
缺點(diǎn):固件實(shí)現(xiàn)復(fù)雜,還得區(qū)分那么那么些是新增的映射表,哪些是被覆蓋的。
選擇哪種寫入決策,應(yīng)根據(jù)硬件架構(gòu),結(jié)合實(shí)際情況考慮。
好了,這次先寫到這兒,祝各位生活愉快。


地址映射是FTL最原始最基本的功能
浙公網(wǎng)安備 33010602011771號(hào)