作者简介
刘孝冬,存储软件工程师,主要从事SPDK以及ISA-L软件开发工作。
Open-Channel SSD 是由Host深度控制和维护的一种SSD. 相对于NVMe SSD, Host所能够看到的不再是一段逻辑块地址(Logical Block Address, LBA),而是间隔排列的NAND存储单元的物理页地址(Physical Page Address, PPA)。Open-Channel SSD 将内部NAND介质的诸多细节暴露给Host,由Host来实现自定义的FTL(Flash Translation Layer),根据实际工作负载的特点,最大化,且有区别的实现高吞吐,低时延,或IO隔离等特性。
LightNVM 是Linux 内核中操作Open-Channel SSD的子系统的名称,并作为实际操作Open-Channel SSD的driver。既然Open-Channel SSD的愿景是希望Host是基于实际工作负载的特点,来调配操作盘上NAND资源。那就意味着,开发者需要基于业务需求,灵活实现定制化的FTL。这些定制化的软件则更有可能会被实现在用户态,而非内核态。
由此,用户态定制化FTL需要一套能够提供操作Open-Channel SSD的API。从名称可知liblightnvm就是这样一套在用户态操作Open-Channel SSD的函数库。
Liblightnvm 的组成
libIightnvm 提供了Open-Channel SSD与用户空间交互的方法,和获取信息的手段。它的组成部分由图1所示
Figure 1 liblightnvm的组成部分
1. liblightnvm.a与相关头文件
它的核心是函数库 liblightnvm.a与相关头文件 , 其中定义了Open-Channel SSD所需的各种结构,向上提供出封装好的nvm_dev_XXX和nvm_cmd_XXX系列函数。
nvm_dev_XXX用于打开、关闭Open-Channel SSD,获取盘上资源信息,设置相关配置。
nvm_cmd_XXX用于执行相关的admin命令和IO命令。
为了简便用户态应用 操作Open-Channel SSD,函数库 liblightnvm.a与相关头文件也包含了基本的辅助功能, nvm_addr_XXX,nvm_buf_XXX,以及nvm_vblk_XXX系列函数。
nvm_buf_XXX封装了内存申请、释放填充等操作。由于liblightnvm的后端对内存类型有不同的需求,使用nvm_buf系列API可以屏蔽掉不同类型内存操作的差异。
nvm_addr_XXX 包括了很多非常方便的地址转换结构的方法。Open-Channel 涉及到的地址表示方法主要有4类:NAND成员结构地址(Generic address, gen), 设备物理页地址 (device physical page address, dev), Chunk信息偏移地址(Chunk information log page offset, lpo), 以及块设备偏移地址(Linux Block Device offset, off)。
nvm_vblk_XXX包括了对Virtual Block的定义和操作。
2. liblightnvm的后端nvm_be
Liblightnvm 将具体的执行过程隐藏在不同的后端nvm_be中。当前liblightnvm的nvm_be有多个,nvm_be_ioctl、nvm_be_lbd 和nv