利用NiosII搭建的固态盘设备系统
使用NAND型闪存(Flash)作为存储介质,而使用与硬盘完全一致的ATA接口作为设备接口的固态盘(SolidState Disk, SSD)是一种全新的存储设备。本文介绍一种基于NiosII的SOPC系统的固态盘设备系统实现方法,给出一种可行的系统结构,包括硬件系统以及软件中内部数据缓存策略、闪存擦写/存储策略的模块化实现方式,并给出具体的实现细节。
关键词 固态盘 SSD 闪存 ATA NiosII
引言
随着电子技术的发展,人们不断地追求更好的新型存储设备。目前海量存储领域中的主流产品非硬盘莫属,而固态盘则被认为是一种最有可能取代硬盘的全新解决方案。与硬盘相比,其主要的优势在于能够达到更高速度、更小体积、更低功耗、更小噪声、更高可靠性,同时与硬盘一样使用方便。
广义上讲,固态盘设备包括所有使用半导体芯片作为存储介质的存储设备,例如使用动态RAM存储数据的某些特定设备,或是CF/SD/MMC卡等同样使用闪存存储数据但使用了其他接口的存储设备;但狭义上讲,固态盘仅指使用NAND型闪存存储数据,使用ATA/SATA/SCSI等接口,在行为上与硬盘完全一致的存储器。在下文中,固态盘一词仅指狭义上的固态盘。本文介绍的是一种使用ATA接口的固态盘的实现方法。
1 系统设计
系统对外的主要功能是通过ATA接口完成数据的读/写,与NAND型闪存芯片间的数据交换是通过缓存来完成的,对闪存芯片的读/写操作由系统内部完成。
ATA协议中含有专门针对闪存而设计的CFA指令部分,包含了闪存擦写等指令内容,CF(Compact Flash)卡即使用了该命令集;而普通硬盘使用的ATA接口一般不使用该命令集,操作中只涉及数据的读/写操作和一些辅助特性的设置。因此在固态盘设计中不能利用CFA指令将ATA接口直接转接至闪存接口,必须在系统内部自动处理与闪存相关的操作,即通过系统的内部处理向上隐藏这一操作细节。
可以在系统中通过数据缓存来把ATA端操作和闪存端操作分离开来,这样就可以方便地解决传输协议的转换和管理问题。基于这种设计思路,综合考虑闪存的管理、与ATA协议的衔接等问题,可以将实现系统时的主要问题归结为如下两个方面:
① 数据缓存管理,主要面对与主机端数据交换如何发生的问题,包括缓存数据的建立、查询、维护、失效、销毁等问题。
② 数据存储管理,主要面对数据在闪存中的物理存储问题,包括均衡磨损、坏块映射等问题。
由此得到的系统逻辑结构框图如图1所示。
在具体的实现中,系统使用独立的硬件接口完成ATA接口控制和NAND型闪存控制;使用大容量SDRAM芯片作为数据缓存,由Nios处理器负责调度数据流;使用Avalon总线连接所有模块,提供快速响应的控制连接和高带宽的数据连接。
在Nios上运行的软件负责所有组件的控制。由于需要确保响应时间,软件中不使用包括实时操作系统在内的任何嵌入式操作系统,所有软件直接贴近硬件事件设计,重要事件采用中断响应,普通事件采用轮询响应。
2 系统硬件设计
系统采用SOPC的设计方式,使得硬件系统获得相当高的灵活度;而将所有控制逻辑集成在一个FPGA内部的设计方法,在增强了系统可靠性的同时,也降低了对外部板级电路的设计要求。系统除FPGA芯片以外,还使用了数据存储用NAND型闪存芯片、缓存用SDRAM、ATA接口连线以及Nios程序的代码存储/运行的相关芯片。
2.1 Nios系统简介
一个基于Nios的SOPC系统主要包括Nios处理器、Avalon总线结构和其他通过总线互连的组件模块。
Nios处理器主要分为两代,即Nios处理器和NiosII处理器。现在广泛使用的是NiosII处理器,下文均是针对NiosII处理器。最新的Avalon总线标准是一套拥有AvalonMM和AvalonST两套分支标准的SOPC总线规范。下文中Avalon总线一词泛指这两套规范。在Altera提出的SOPC设计概念当中,两者将分别用于不同的数据应用,因此两者的基本结构差异很大:AvalonMM接口是一套互联式总线接口,主要用于多节点的互联;而AvalonST接口是一种单向点对点的接口,主要用于单向高速数据流的传输。在SOPC设计中,可以针对不同需求将二者结合起来使用,以提高设计的工作性能。由于AvalonST接口是最近刚刚提出的,目前广泛使用的是AvalonMM接口,在一般设计中,完全能够提供足够的传输带宽。
2.2 硬件平台结构
硬件系统即FPGA内部基于NiosII处理器的SOPC系统,包括ATA控制器、NAND型闪存控制器、DMA控制器、2个SDRAM控制器、CFI接口闪存控制器以及其他辅助组件等,其结构框图如图2所示。
在该结构中,使用一块SDRAM作为NiosII处理器的程序运行空间,使用一块CFI接口的闪存作为NiosII处理器的软件代码的存储空间,其他I/O和其他组件包括了定时器、调试端口以及用于显示系统状态的PIO端口等。总线DMA控制器用于完成NAND型闪存与缓存空间之间的数据交换。ATA控制器则负责ATA接口的实现,并根据配置参数利用自带的DMA控制器直接完成与缓存之间的数据交换。NiosII处理器通过控制总线DMA控制器和ATA控制器来管理整个系统的数据流,实现灵活的管理策略。
所用的这些控制器中,除了NAND型闪存控制器和ATA控制器需要自定义开发外,都可以使用标准的IP模块。NAND型闪存控制器和ATA控制器在自定义开发完成后也被集成到开发系统之中,可以方便地调用。
ATA控制器负责ATA接口的实现。它是系统中最复杂的组件,所有与主机间的交互均通过ATA接口完成。为了满足各种需求,ATA控制器除了实现基本的ATA传输协议之外,开发中还增加了如下功能:
① 自带DMA控制器。ATA控制器中自带一个DMA控制器,只需给定源地址或目的地址,ATA控制器自带的DMA控制器就可以自动完成与缓存之间的数据交换。
② 带有中断信号源。ATA控制器带有一个中断源,当接收到主机端读/写传输请求时,即可发起一个中断提示处理器优先处理该事件。
③ 采用与系统异步的时钟。为了达到最优性能,ATA控制器可以使用与系统异步的时钟信号,而使用异步时钟桥与系统总线连接。例如在该系统实现中,主系统运行在65 MHz,而ATA控制器运行在100 MHz。
NAND型闪存控制器则做成通用的接口控制器,提供基本的NAND型闪存读/写/擦除等操作即可。
3 系统软件设计
基于NiosII的SOPC平台搭建完成之后,需要在NiosII上设计适当的软件以调度整个系统,实现数据的缓存策略和存储策略。在软件设计中,采用了一种流程控制与策略控制弱耦合的结构,使得缓存策略和存储策略可以独立开发。
3.1 系统流程
考虑到所有事务中最频繁和最重要的事务都是与ATA控制器相关的,因此在系统算法中做如下设计:在ATA控制器和NiosII之间连接中断信号,使用中断服务来处理相关事务,而其他事务则采用软件轮询的方式处理。一个典型的处理流程如图3所示。
图3并非完整的软件流程(未涉及调试、错误处理以及其他辅助流程),仅仅标示出了系统最为重要的几个处理环节:缓存检查与维护、ATA读/写请求的处理。从该系统流程设计中可以看到,系统在运行过程中将在一个软件主循环中不断进行数据检查与维护,而当ATA中断来到时则转入ATA中断处理。数据维护模块和ATA处理模块是系统流程控制的主要部分。
数据维护模块主要负责检查缓存块是否老化/失效,缓存空间的碎片状态,并根据实际情况对缓存数据进行清理。而其中缓存片和缓存段所有的检查、判断、处理操作,都是直接调用缓存管理模块的相关函数,即直接依赖于缓存策略。该模块流程如图4所示。
ATA中断处理模块是在ATA控制器发起中断时进入处理模块的。ATA中断模块的主要任务包括查询ATA控制器的事务状态及参数,获取所需数据区域在NAND型闪存中的信息,申请缓存片,完成数据交换并清ATA中断。其中数据区信息由存储管理模块提供,而缓存的申请则是调用缓存管理模块的接口函数完成。该模块流程如图5所示。
软件控制流程中还包含一些辅助性的模块,以保证系统的鲁棒性。这些辅助性的模块包括独立的系统初始化模块、系统软复位模块和调试模式模块等,以便在系统出现错误时及时复位整套系统,维持系统正常的工作,或者供开发人员了解系统的错误所在。
3.2 存储管理模块
存储管理模块主要实现了数据在NAND型闪存中的存储策略。存储管理模块主要管理的信息包括:逻辑地址到物理块地址的映射信息、物理块磨损程度信息以及坏块映射信息。其主要作用是确保系统工作的鲁棒性以及尽量平均闪存块的磨损程度。当系统接收到主机的数据读/写请求时,首先须通过存储管理模块定位其物理位置信息,然后才能根据该信息创建缓存片,完成数据交换。
当系统需要将某格缓存片排空删除时,对数据的回写是需要根据缓存片内保留的相关信息来完成具体操作的。
存储管理模块的对外接口设计只有一个函数,即地址转换,输入操作的各种参数,返回一个确定的物理块描述结构,如表1所列。
在该函数内,将进行逻辑地址到物理地址的转换以及坏块再映射等操作,确保最终给出的数据信息是真正正确的物理信息。在返回提供的数据信息中,包括了应读取区域和应写入区域两个部分,这两个部分可以不相同,这样可以方便均衡磨损算法的设计。例如,如果一个块的写入次数已经达到一定程度,那么当出现对该块的写请求时,可以将应读取区域指定为该区域,而应写入区域指向另一个物理块,同时修改逻辑地址到物理地址的映射信息,那么当相应缓存片被销毁时,数据被写入新块,即在保证映射关系的同时避免了对该块的过度擦写。
3.3 缓存管理模块
缓存管理模块主要负责缓存的管理,所有与缓存相关的操作均须通过缓存管理模块提供的接口函数来完成。缓存管理模块管理的基本单元是缓存片(buffer clip),对每次传输请求,缓存管理将根据给定信息在缓存空间中开辟一个缓存片,用于该传输的数据交换。根据缓存片可能的繁忙程度,可以给予其不同的驻留时间,一种可行的方法是将物理缓存空间分成若干段,每段对应不同的驻留时间,开辟缓存片之前可以首先定位到某个段再进行操作。这样可以有效地提高缓存片碎片整理和维护的工作效率。
缓存管理模块对外接口非常简单,这样可以有效地隐藏缓存策略,使用段/片两级管理策略的缓存管理模块对外接口如表2所列。
其中申请缓存片的操作是唯一一个必须对外开放的接口,其他3个对缓存段的操作接口属于可选式开放,即如果外部不需要的话,可以由缓存管理模块自行进行缓存段的整理工作。
申请缓存片是缓存操作中最常用的操作。在具体过程中,需要判断数据段是否已经被缓存,以及当前缓存空间是否有足够的空间开辟新的缓存片,并在必要时对缓存空间进行一些整理以获取相关资源等。一种可行的操作流程如图6所示。
在上述操作中,需要用到很多与缓存相关的操作,例如,查询状态、创建片、调整片、删除片等。这些操作都封装成通用的处理函数集成在缓存管理模块内部,供上层策略调用,但对外并不开放。
结语
基于NiosII搭建的固态盘设备系统完整地实现了固态盘应有的功能。通过使用灵活的SOPC系统,配合弱耦合的软件结构,使得核心算法的开发与系统的相关程度降到了最低,极大地方便了核心算法的独立开发。这就使系统能够在保证基本功能的同时,拥有了足够的灵活性来面对各种可能的需求。
固态盘是近几年最有希望替代硬盘成为主流存储设备的新型存储设备,各种系统结构设计和相关算法等技术都在不断的更新。面对各种实际问题,研究固态盘的系统结构和各种关键算法不仅具有重要的学术意义,同时还有广阔的应用前景。
评论
查看更多