flashsim中读写操作的函数调用流程是: callFsim()
–> send_flash_request()
–> opm_write()
–> nand_page_write()
。
callFsim()
: 主要解决的是缓冲区中映射表的查找和替换。send_flash_request()
: 通过判断当前使用的是什么类型的FTL,然后将读写请求发送到该 FTL 中去处理。opm_write()
: FTL 中的读写操作,nand_page_write()
: 最底层的读写操作的实现。
下面以 DFTL 为例,介绍下dftl中的写操作。在 dflt.c 中声明了两个全局变量 free_blk_no[]
和 free_page_no[]
,两个数组的大小都是2,含义如下:
free_blk_no[0]
:当前正在写的用户数据,写入到哪个block中free_blk_no[1]
:当前正在写的映射表,写入到哪个block中free_page_no[0]
:下一个将要写的用户数据,写入到哪个page中free_page_no[1]
:下一个将要写的映射表,写入到哪个page中
所以,当我们要写入一个页的用户数据时,由 free_blk_no[0] 和 free_page_no[0] 可以确定该数据写入到哪个物理页上。当我们要写入一个映射页到闪存上时,由 free_blk_no[1] 和 free_page_no[1] 可以确定该映射页写入到哪个物理映射页上。
opm_write()函数
1 | // lsn表示起始的logicial sector number |
nand_page_write()函数
1 | _u8 nand_page_write(_u32 psn, _u32 *lsns, _u8 isGC, int map_flag){ |
nand_get_free_blk()函数
1 | // isGC 表示是否在GC过程中调用这个函数 |