API

Flash-DBSim 系统为开发者提供了两类 API 接口:公共 API 接口内部 API 接口。如果只需要使用 Flash-DBSim 系统进行闪存技术研究,那么您只需要了解公共 API 接口即可;如果您希望对 Flash-DBSim 系统进行二次开发和功能扩展,则需要了解其内部 API 接口

基本类型

RV Flash-DBSim 系统接口函数返回值类型。如果函数返回正确,则返回值为 RV_OK
BLOCK_ID 物理块号。
PAGE_ID 物理页号。
LBA 逻辑块地址。
ID_MODULE Flash-DBSim 系统模块 ID 号。
IDM_VFD, IDM_FTL Flash-DBSim 系统 VFD, FTL 模块 ID 号。
VFD_ID Flash-DBSim 系统提供的 VFD 模块的 ID 号(IDM_VFD),不同的 ID 号对应不同的 VFD 模块,每个 VFD 模块提供不同的虚拟闪存功能。
当前提供的所有 VFD 模块 ID 号如下所示:
FTL_ID Flash-DBSim 系统提供的 FTL 模块的 ID 号(IDM_FTL),不同的 ID 号对应不同的 FTL 模块,每个 FTL 模块提供不同的闪存转换层算法。
当前提供的所有 FTL 模块 ID 号如下所示:
VFD_INFO  VFD 模块配置信息结构体。
VFD_INFO 各字段含义如下:
  • id: VFD 模块 ID 号。
  • blockCount: 虚拟闪存设备中的擦除块总数。
  • pageSize.size1: 虚拟闪存设备中的数据页数据空间大小,单位:字节。
  • pageSize.size2: 虚拟闪存设备中的数据页附加空间大小,单位:字节。
  • pageCountPerBlock: 每个擦除块中的数据页的总数。
  • eraseLimitation: 每个擦除块的擦除次数限制。
  • readTime.randomTime: 虚拟闪存随机读取操作的时间延迟。
  • readTime.serialTime: 虚拟闪存顺序读取操作的时间延迟。
  • programTime: 写入操作的时间延迟。
  • eraseTime: 擦除操作的时间延迟。
FTL_INFO  FTL 模块配置信息结构体。
FTL_INFO 各字段含义如下:
  • id: FTL 模块 ID 号。
  • mapListSize: FTL 算法中地址映射空间的大小(即:可分配从 0 ~ mapListSize-1 范围内的逻辑地址)。
  • wearLevelingThreshold: 负载均衡算法阈值。

注意:VFD_INFO 和 FTL_INFO 中的各字段配置数据,根据具体模块的不同,并非全部都是必须的,个别模块只需要使用其中的部分字段。关于模块所需要使用的字段的具体信息,请参见本网站“模块”页面。

公共 API 接口

开发者通过调用 Flash-DBSim 系统所提供的公共 API 接口进行操作。Flash-DBSim 系统提供的所有公共 API 接口及其详细说明如下所示:

  1. f_initialize
  2. f_release


  3. f_alloc_page
  4. f_release_page
  5. f_read_page
  6. f_write_page


  7. f_get_read_count 
  8. f_get_write_count 
  9. f_get_erase_count 
  10. f_get_read_count_total 
  11. f_get_write_count_total 
  12. f_get_erase_count_total 
  13. f_get_read_latency_total 
  14. f_get_write_latency_total 
  15. f_get_erase_latency_total 
f_initialize
说明: Flash-DBSim 系统初始化函数,用于初始化系统的数据、状态以及运行模块。
RV f_initialize(
  const VFD_INFO& vfdInfo,
  const FTL_INFO& ftlInfo
);
返回值: RV
参数列表:
vfdInfo Flash-DBSim 系统需要使用的 VFD 模块的定义信息。
ftlInfo Flash-DBSim 系统需要使用的 FTL 模块的定义信息。
示例: 参见 f_release 示例
f_release
说明: Flash-DBSim 系统释放函数,用于释放系统占用的数据、内存、运行模块。
RV f_release();
返回值: RV
参数列表: (空)
示例: VFD_INFO vfdInfo;  /* VFD 模块信息 */
FTL_INFO ftlInfo;  /* FTL 模块信息 */

/* 设置 vfdInfo, ftlInfo 参数 */
vfdInfo.id = ID_NAND_DEVICE_03;
vfdInfo.blockCount = 1024;
vfdInfo.pageCountPerBlock = 64;
vfdInfo.pageSize.size1 = 2048;
vfdInfo.pageSize.size2 = 0;
vfdInfo.eraseLimitation = 100000;
vfdInfo.readTime.randomTime = 25;
vfdInfo.readTime.serialTime = 0;
vfdInfo.programTime = 200;
vfdInfo.eraseTime = 1500;

ftlInfo.id = ID_FTL_01;
ftlInfo.mapListSize = 65536;
ftlInfo.wearLevelingThreshold = 4;

RV rv = f_initialize(vfdInfo, ftlInfo);
if (rv != RV_OK) {
    printf("initialize failed!\n");
    return;
}

/* 调用 Flash-DBSim 系统其他公共 API 函数 */

f_release();
f_alloc_page
说明: 请求系统分配指定数量的空闲数据页。
int f_alloc_page(
  int count,
  LBA * lbas
);
返回值: int, 成功分配的数据页的数量。
参数列表:
count 请求分配的数据页的数量。
lbas 保存分配的数据页的 LBA 地址。
示例: 参见 f_release_page 示例
f_release_page
说明: 释放指定的数据页。
RV f_release_page(
  LBA lba
);
返回值: RV
参数列表:
lba 待释放的数据页的 LBA 地址。
示例: LBA lba[10] = {-1};
int size = f_alloc_page(10, lba);  /* 分配 10 个数据页 */

......

for (int i = 0; i < 10; i++)
    f_release_page(lba);  /* 释放之前分配的数据页 */
f_read_page
说明: 读取指定数据页中的数据。
RV f_read_page(
  LBA lba,
  BYTE * buffer,
  int offset,
  size_t size
);
返回值: RV
参数列表:
lba 待读取的数据页的 LBA 地址。
buffer 保存从数据页中读取的字节数据。
offset 数据页中开始读取数据的起始偏移量。
size 读取数据的长度。
示例: BYTE buffer[4096];
RV rv = f_read_page(lba, buffer, 0, 4096);
f_write_page
说明: 将数据写入指定数据页中。
RV f_write_page(
  LBA lba,
  const BYTE * buffer,
  int offset,
  size_t size
);
返回值: RV
参数列表:
lba 待写入的数据页的 LBA 地址。
buffer 将要写入到数据页中的字节数据。
offset 数据页中开始写入数据的起始偏移量。
size 写入数据的长度。
示例: BYTE buffer[4096] = {0xFF};
RV rv = f_write_page(lba, buffer, 0, 4096);
f_get_read_count 
说明: 获取指定数据页的读取操作次数。
int f_get_read_count(
  BLOCK_ID blockID,
  PAGE_ID pageID
);
返回值: 指定数据页的读取操作次数。
参数列表:
blockID 数据页块号。
pageID 数据页页号。
示例: int count = f_get_read_count(14, 63);
f_get_write_count 
说明: 获取指定数据页的写入操作次数。
int f_get_write_count(
  BLOCK_ID blockID,
  PAGE_ID pageID
);
返回值: 指定数据页的写入操作次数。
参数列表:
blockID 数据页块号。
pageID 数据页页号。
示例: int count = f_get_write_count(14, 63);
f_get_erase_count 
说明: 获取指定数据块的擦除操作次数。
int f_get_erase_count(
  BLOCK_ID blockID
);
返回值: 指定数据块的擦除操作次数。
参数列表:
blockID 数据块块号。
示例: int count = f_get_erase_count(14);
f_get_read_count_total 
说明: 获取所有数据页的读取操作总次数。
int f_get_read_count_total();
返回值: 所有数据页的读取操作总次数。
参数列表: (空)
示例: int count = f_get_read_count_total();
f_get_write_count_total 
说明: 获取所有数据页的写入操作总次数。
int f_get_write_count_total();
返回值: 所有数据页的写入操作总次数。
参数列表: (空)
示例: int count = f_get_write_count_total();
f_get_erase_count_total 
说明: 获取所有数据块的擦除操作总次数。
int f_get_erase_count_total();
返回值: 所有数据块的擦除操作总次数。
参数列表: (空)
示例: int count = f_get_erase_count_total();
f_get_read_latency_total 
说明: 获取所有数据页的读取操作总延迟时间。
int f_get_read_latency_total();
返回值: 所有数据页的读取操作总延迟时间。
参数列表: (空)
示例: int count = f_get_read_latency_total();
f_get_write_latency_total 
说明: 获取所有数据页的写入操作总延迟时间。
int f_get_write_latency_total();
返回值: 所有数据页的写入操作总延迟时间。
参数列表: (空)
示例: int count = f_get_write_latency_total();
f_get_erase_latency_total 
说明: 获取所有数据块的擦除操作总延迟时间。
int f_get_erase_latency_total();
返回值: 所有数据块的擦除操作总延迟时间。
参数列表: (空)
示例: int count = f_get_erase_latency_total();

内部 API 接口

Flash-DBSim 系统使用模块化的方式进行设计(参见“Flash-DBSim 架构”),各模块之间使用内部 API 接口进行交互和通讯。Flash-DBSim 系统中的各模块,只要都遵循其预定义的内部 API 接口,就能够正确地与其他模块工作。

虽然 Flash-DBSim 已经提供了一些通用 VFD 模块和 FTL 模块,每个模块都能够完成特定的功能和算法,但是对于使用者自己特有的算法,则需要自行编写 VFD 模块或 FTL 模块。对于开发者自行开发的 VFD 或 FTL 模块,需要遵循 Flash-DBSim 系统中 VFD/FTL 模块接口定义,关于对 Flash-DBSim 系统进行二次开发或功能扩展的详细介绍,请参见“使用”页面中的“Flash-DBSim 模块开发”一节。Flash-DBSim 系统提供的所有内部 API 接口及其详细说明如下所示。

VFD 模块

  1. IVFD_MODULE
  2. IVFD_COUNTER 
  3. IVFD_LATENCY 
IVFD_MODULE
说明: VFD 模块接口,所有 VFD 模块都继承自该接口。
接口函数:
GetModuleInfo 获取该 VFD 模块的模块配置信息(参见 VFD_INFO)。
GetFlashType 获取该 VFD 模块的虚拟闪存设备类型(参见 FLASH_TYPE)。
Initialize 初始化 VFD 模块。
Release 释放 VFD 模块数据。
EraseBlock 擦除指定擦除块中的数据。
ReadPage 读取指定数据页中的数据。
WritePage 将数据写入指定数据页中。
IVFD_COUNTER 
说明: VFD 模块操作计数接口,如果 VFD 模块需要提供读、写、擦除操作计数功能,则需要继承该接口。
接口函数:
GetReadCount 获取指定数据页的读操作次数。
GetWriteCount 获取指定数据页的写操作次数。
GetEraseCount 获取指定数据块的擦除操作次数。
GetReadCountTotal 获取所有数据页的读操作总次数。
GetWriteCountTotal 获取所有数据页的写操作总次数。
GetEraseCountTotal 获取所有数据块的擦除操作总次数。
ResetReadCount 将所有数据页的读操作计数器重置为 0。
ResetWriteCount 将所有数据页的读操作计数器重置为 0。
ResetEraseCount 将所有数据块的读操作计数器重置为 0。
ResetCount 将所有数据页/块的全部计数器重置为 0。
IVFD_LATENCY 
说明: VFD 模块操作延迟计时接口,如果 VFD 模块需要提供读、写、擦除操作延迟时间的计时功能,则需要继承该接口。
接口函数:
GetReadLatencyTotal 获取所有数据页的读操作总延迟时间。
GetWriteLatencyTotal 获取所有数据页的写操作总延迟时间。
GetEraseLatencyTotal 获取所有数据块的擦除操作总延迟时间。
ResetReadLatencyTotal 将所有数据页的读操作延迟时间重置为 0。
ResetWriteLatencyTotal 将所有数据页的写操作延迟时间重置为 0。
ResetEraseLatencyTotal 将所有数据块的擦除操作延迟时间重置为 0。
ResetLatencyTotal 将所有数据页/块的全部操作延迟时间重置为 0。

FTL 模块

  1. IFTL_MODULE
IFTL_MODULE
说明: FTL 模块接口,所有 FTL 模块都继承自该接口。
接口函数:
GetModuleInfo 获取该 FTL 模块的模块配置信息(参见 FTL_INFO)。
Initialize 初始化 FTL 模块。
Release 释放 FTL 模块数据。
AllocPage 分配指定数量的空闲数据页。
ReleasePage 释放指定的数据页空间。
ReadPage 读取指定数据页中的数据。
WritePage 将数据写入指定数据页中。