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 中的各字段配置数据,根据具体模块的不同,并非全部都是必须的,个别模块只需要使用其中的部分字段。关于模块所需要使用的字段的具体信息,请参见本网站“模块”页面。
开发者通过调用 Flash-DBSim 系统所提供的公共 API 接口进行操作。Flash-DBSim 系统提供的所有公共 API 接口及其详细说明如下所示:
- f_initialize
- f_release
- f_alloc_page
- f_release_page
- f_read_page
- f_write_page
- f_get_read_count
- f_get_write_count
- f_get_erase_count
- f_get_read_count_total
- f_get_write_count_total
- f_get_erase_count_total
- f_get_read_latency_total
- f_get_write_latency_total
- 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();
|
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 模块
- IVFD_MODULE
- IVFD_COUNTER
- 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 模块
- IFTL_MODULE
|
|
IFTL_MODULE |
说明: |
FTL 模块接口,所有 FTL 模块都继承自该接口。 |
接口函数: |
GetModuleInfo |
获取该 FTL 模块的模块配置信息(参见 FTL_INFO)。 |
Initialize |
初始化 FTL 模块。 |
Release |
释放 FTL 模块数据。 |
AllocPage |
分配指定数量的空闲数据页。 |
ReleasePage |
释放指定的数据页空间。 |
ReadPage |
读取指定数据页中的数据。 |
WritePage |
将数据写入指定数据页中。 |