Mapping table in FTL
基本概念
• SSD内部维护了一张逻辑页(LBA)到物理页地址转换的映射表(Map Table)。用户每写入一个逻辑页,就会产生一个新的映射关系,这个映射关系会加入(第一次写)或者更改(覆盖写)映射表。当读取某个逻辑页时,
SSD首先查找映射表中该逻辑页对应的物理页,然后再访问闪存读取相应的用户数据;
• 一般逻辑页(LBA,例如512B,4KB)空间小于Flash物理页(例如16KB),所以实际上是若干个逻辑页写在一个物理页中,逻辑页和子物理页一一对应;
• 假设我们有一个256GB的SSD,以4KB大小的逻辑页为例,那么用户空间一共有64M(256GB/4KB)个逻辑页,也就意味着SSD需要有能容纳64M条映射关系的映射表。映射表中的每个单元(entry)存储的就是物理地址(Physical Page Address),假设其为4字节(32 bits),那么整个映射表的大小为64M×4B=256MB。一般来说,映射表大小为SSD容量大小的千分之一 (4Byte的地址指向4KB空间)
• 映射表可能存放于DRAM,或Controller内的SRAM,或Flash内,或HMB里面; 当SRAM或DRAM空间不足时,需要多级映射表(对DRAM less的SSD,常常是三级映射);
•
• 系统上电时,映射表从Flash加载到RAM;下电时映射表从RAM被刷入Flash; 在SSD运行过程中,RAM里的映射表也会按照一定的策略刷写进FLASH。
• 如果系统异常掉电,RAM里的映射表会丢失,FLASH里的映射表备份没有及时更新,则下次上电时需要重建映射表。方法是读取NAND的元数据(Meta data) 根据元数据里的LBA和时间戳来重建映射表;(SSD在把用户数据写
到闪存的时候,会额外写入元数据,包括该笔用户数据对应的逻辑地址和时间戳等 )
PC300 mapping table
• PC300使用的TAS NAND,TAS单die容量32GB,有4个plane, 每个plane 496个block,每个block 2304个TLC page或768个SLC page; PC300 256GB/512GB/1TB 分别使用2个DDP(2CH,2CE)、QDP(2CH,4CE)、ODP(2CH,8CE) NAND package作为Media; 连接了主控8个CH中的其中4个CH;
• PC300 地址映射中有三个术语:a. User Address(LBA, 以512B为一个单位),b. Host address(分为三个层级: Hpage, 单个占4B空间;Hsegement, 单个包含512个Hpage,Hblock, 单个包含16个Hsegement),c. Flash Address(包括Fblock和Fpage);
• 每个4Byte(32bit)的Hpage里存放的内容是Host address对应的Flash address, 是为H2F,H2F table是host address到Flash address的映射表, H2F table分散存在TSB RAM,HMB以及Flash static SLC block中;
• Flash address是由NAND Flash物理拓扑结构决定的。Flash address包括了CH(2bit), CE(0~2bit), LUN(无),Plane(2bit), physical Block(10bit), physical Page(12bit), 4K offset(2bit)等;每4Byte的Flash address指向4KB的Flash存储空间, 此4KB空间视为一个Fpage(每4KB空间能容纳8个LBA); Flash 1个physic page有16KB空间,可容纳4个Fpage;
• Host address由LBA地址经过算术运算得到(整除和取余运算),对PC300 1TB: Hpage=(LBA%64K)/8; Hsegement= Hpage/512; Hblock=LBA/64K;
•
• Host address由LBA地址经过算术运算得到(整除和取余运算),对PC300 1TB: Hpage=(LBA%64K)/8; Hsegement= Hpage/512; Hblock=LBA/64K;
• PC300为了写IO的效率,还维护了F2H table, 是为Flash address 到 Host address的映射;
SoftSSD address mapping
• SoftSSD的address mapping是在AMU.c里面实现的(在FIL目录下)
•
• host的读写以Sector为单位,sector size是4KB或者512B,一个flash page可容纳多个sector, address mapping使用bitmap来标记哪些sector是有效的;transation entry数据结构定义如下:
Struct xlat_entry{
PPA_t ppa; // uint32_t,flash physical page address
uinit32_t bitmap;
};
• 页(page)的概念有四种:分别是LPA(数据的逻辑页),PPA(数据的物理页), mvpn(mapping table的虚拟页),mppn(mapping table的物理页)
• PPA/mppn由硬件拓扑决定的。例如: ppa=addr.page + addr.block * PAGES_PER_BLOCK + addr.plane * PAGES_PER_plane + addr.die * PAGES_PER_DIE + addr.chip * PAGES_PER_CHIP + addr.channel *PAGES_PER_CHANNEL
• 对LPA使用除法和取余运算可以得到mvpn, 在get_mvpn()和get_mvpn_slot()函数中,mvpn=lpa/domain->xlate_ents_per_page; slot=lpa % domain->xlate_ents_per_page
• Xlate_entry_page将mvpn于mppn联系起来,其数据结构定义如下:
Struct xlat_page{^K
mvpn_t mvpn; // uint32_t,mapping virtual page number
struct xlate_entry * entries ; //pointer to flash physical page
int dirty;
mutex_t mutex;
struct avl_node avl;
struct list_head lru;
unit pin_count;
};
• 板上的eMMC存储了一个bin文件gtd_ns%d.bin,它记录了mapping table所在的flash物理页
• xlat_page结构体用于cache缓存transaltion page,其中包含了xlate_entry * 指针,该指针指向数据所在的地址(是ppa的数组);
• 上电初始化时,domain_init()函数调用restore_gtd()来从eMMC 上gtd_ns%d.bin读入数据存入gtd[mvpn]数组
• 新开卡状态下,gtd[mvpn]的元素为空置(NO_MPPN), 相应的xlate_entry*也指向空值(NO_PPA);
• get_translation_page()函数先根据mvpn从cache里检索对应的xlate_page结构体, 如果缓存里没找到,就调用xpc_add()在cache创建一个xlate_page结构体,并调用xpc_read_page()执行NAND读操作,从gtd[mvpn]元>素指向的ppa读取内容并存入xlate_page结构体中;
• 调用xpc_flush_page()会将xlate_page结构体写入Flash(作为Mapping table); flash address 来自alloc_page_for_mapping()函数(该函数进一步调用bm_alloc_page())的调用
• 下电时flush_domain()函数调用xpc_flush_page()函数将缓存中的所有xlate_page写入flash,并且调用save_gtd()会将gtd[mvpn]数组写入到eMMC(gtd_ns%d.bin文件)