Paper标题是DFTL: A Flash Translation Layer Employing Demand-based Selective Caching of Page-level Address Mappings,PSU发表在ASPLOS 09上。这篇paper对我来说更像是篇flash存储的科普文。

flash存储单元分block和page,每个block有32/64个page,一个page有512/2048K大小。flash的一个缺点在于改写数据时只能先把要改写的block清空,然后再写,由于block的颗粒度比较大,这就带来了比较严重的性能问题。所以现在的flash都在驱动层维护了一张对文件系统透明的logical-to-physical address的映射表(Flash Translation Layer),这样改写时只要先写在预先清空的page上,再把映射表的对应项的物理地址改成新的page的地址,然后把原来要改的页置为invalid,等gc去清空即可。

如果为每个page都在内存中维护一份映射关系,会占用比较大的内存空间。以往的ftl的实现试图在page-level和block-level的映射中找平衡,但效果都不甚理想,尤其在随机写比较频繁时会产生比较严重的gc负荷,从而影响写操作的反应速度(因为预先清空的页面不足时需要先做gc)。这篇paper提出的DFTL可以比较好的减少gc的负荷,同时近需要很小的内存空间,前提是程序访问flash的locality很好。

感觉DFTL的大致思想仿照了二级页表和TLB:flash上的一些page保存了page-level的映射,分散在整个flash中,在内存里面有一个block-level的映射表,记录了每个page-level映射表在flash中的地址。内存中的映射表相当于二级页表中的page directory,指向了flash上的page-level映射表(page table),另外内存中还有一个全局的page-level的映射表用于记录最近访问到的page的logical-to-physical映射,类似于TLB。这样如果程序locality很好的情况下大多数情况下只要查询这张表就行了。