DFTL是一个页级映射的 FTL,它将映射表存在闪存中,并将一部分映射表放在 SSD 的缓存中。缓存中的映射表经常会被换进换出,DFTL 中采用了 segmented-LRU的方式管理缓存。
在 DFTL 中映射表是放在 opagemap[]
数组中的,数组的大小为所有映射记录的数量,也就是所有 page 的数量。
opagemap[] 数组里的每个元素都是一个 opm_entry
结构体,如下所示:
struct opm_entry { _u32 free : 1; _u32 ppn : 31; int cache_status; int cache_age; int map_status; int map_age; int update; };
为了深入了解映射表缓存的管理,先定义一些变量:
real_min
:在所有 opagemap[].cache_status=MAP_REAL 的记录中,opagemap[real_min].map_age 是最小的。
real_max
:在所有 opagemap[].cache_status=MAP_REAL 的记录中,opagemap[real_max].map_age 是最大的。
MAP_REAL_NUM_ENTRIES
:所有 opagemap[].cache_status=MAP_REAL 的记录的条数。
MAP_GHOST_NUM_ENTRIES
:所有 opagemap[].cache_status=MAP_GHOST 的记录的条数。
相关的操作的是在 ssd_interface.c
中的 callFsim()
函数中实现的。
假设我们要对逻辑页地址为 blkno 的逻辑页进行访问,具体流程如下:
1.如果命中cache (即 opagemap[blkno].map_status == MAP_REAL) || (opagemap[blkno].map_status == MAP_GHOST) (1)opagemap[blkno].map_age++; (2)if(opagemap[blkno].map_status == MAP_GHOST) 1.2.1 更新 real_min; 1.2.2 if(opagemap[real_min].map_age <= opagemap[blkno].map_age) 1.2.2.1 将 opagemap[real_min].map_status 置为 MAP_GHOST; 1.2.2.2 将 opagemap[blkno].map_status 置为 MAP_REAL; (3)if(opagemap[blkno].map_status == MAP_REAL) 1.3.1 更新 real_max; 2.如果没有命中cache: (1)如果 MAP_REAL_NUM_ENTRIES 达到上限值 2.1.1 如果 MAP_GHOST_NUM_ENTRIES 达到上限值 2.1.1.1 剔除 cache_status=MAP_GHOST 记录中 map_age 最小的记录。 2.1.1.2 将 opagemap[real_min].map_status 置为 MAP_GHOST。 2.1.2 如果 MAP_GHOST_NUM_ENTRIES 没有达到上限值 将 opagemap[real_min].map_status 置为 MAP_GHOST。 (2)从闪存中读取映射表,添加新的记录到 opagemap[]。 设置 opagemap[blkno].map_status 为 MAP_REAL。 设置 opagemap[blkno].map_age 为 opagemap[real_max].map_age+1。 3.如果是写请求,标记该记录被修改过,即 opagemap[blkno].update = 1;
上面的流程只是缓存管理的一些核心操作,具体的细节可以看源代码的实现。
[1] Urgaonkar A G Y K B. Dftl: A flash translation layer employing demand-based selective caching of page-level address mappings[J]. Computer Systems Laboratory, department of Computer Science & Engineering. The Pennsylvania State University, Univesity Park, PA, 2008, 16802.
[2] R. Karedla, J. Spencer Love, and Bradley G. Wherry. Caching Strategies to Improve Disk System Performance. IEEE Transactions on Computer, 27(3):38–46, 1994