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文件)