包括将处理器与内部存储器连接的交叉切换器的用于闪存的存储控制器的制作方法

文档序号:6479663阅读:406来源:国知局
专利名称:包括将处理器与内部存储器连接的交叉切换器的用于闪存的存储控制器的制作方法
技术领域
这里所描述的发明涉及数据存储领域,特别涉及使用固态非易失性存储器件的数 据存储应用。该技术特别相关于包含部署在大型数据中心的多用户计算和存储平台的高性 能企业系统,但其也可应用于较小规模的企业应用和最终用户大容量存储。
背景技术
目前企业级的大容量存储依靠硬盘驱动器,所述硬盘驱动器的典型特征为3. 5英 寸形状因子,15000rpm的转轴马达、以及73GB和450GB之间的存储容量。该机械设计与带 有单个致动器与横穿8个表面移动的8个读/写头的传统硬盘驱动器相同。头(head)/介 质技术的约束将读/写能力限制为每次仅一个有效头。发送到该驱动器的所有数据请求被 以串行的方式处理,这在每个如致动器将读/写头移动到所需位置、以及介质旋转以将数 据置于读/写头下的操作之间导致很长的延迟。由于等待致动器的请求队列,系统观察到响应时间增加到用户不可忍受的程度。 大容量存储系统已经通过限制对每个驱动器的未决请求的数量来适应该问题。这具有这样 的效果即使这些驱动器具有高至450GB的容量,也将每个驱动器的有效和可用的容量降 低到每个驱动器12GB。随之,该较低的容量恶化了分层空间、冷却与功率的问题,对企业级 的大容量存储系统,所有这些都变得极为成问题。为了试图减轻这些问题,该行业转向2. 5英寸的驱动器。然而,虽然较小的形状因 子在相同空间中允许更多数量的驱动器,但硬盘驱动器操作的串行性质意味着即使较小形 状因子的驱动器也存在严重的空间、冷却与功率的问题。因为闪存系统没有与硬盘驱动器关联的机械延迟,从而允许更高的性能以及相当 低的成本、功率、发热与空间使用,所以在企业级存储环境中,闪存很有吸引力。然而,传统 上,由于某些技术限制,闪存未被用于这样的环境中。第一个技术问题是写速度,其可以低至机械硬盘驱动器的写速度的十分之一。这 是由于这样的事实如果在写之前没有很长的擦除周期,数据就不能被覆写在NAND闪存 上。因为擦除周期直接影响写性能,所以,大多数闪存设计将写数据移动到新位置,并将擦 除延迟到以后。在繁忙的系统中,所延迟的擦除周期可逐步增大,直到处理器耗尽了空闲闪 存页面而不得不停下来创建新页面为止,因此非常影响系统的性能。第二个技术问题是对于每个闪存页面的特定限制对“单层单元”(“SLC”)器件 来说,100000个擦除周期;对“多层单元”(“MLC”)器件来说,10000个周期。这些对以不 可预见的数据流操作的数据中心造成可以引起“热点”的特殊问题,产生存储器中某些遭受 大量次数的擦除而被高度使用的区域。第三个问题是数据丢失,其可以由于各种影响闪存的因素而发生,所述因素包括 读干扰或程序干扰,它们导致由与被干扰的单元相邻的存储器单元的读或写引起的数据比 特的丢失。由于时间的流逝,闪存单元的状态可能也以不可预见的方式改变。这些技术问题对闪存在高容量、高性能的存储应用中的使用产生严重的问题。在 每种情况中,存在技术解决方案,但这些解决方案对通常包括单个处理器的标准闪存控制 器中可用的处理能力施加了很大的压力。该压力使得很难克服这些环境中的技术问题。

发明内容
在一个实施例中,所描述的对闪存的性能限制的解决方案包括在控制器设计中使 用多个微处理器,由此创建多个并行的独立流水线,每个流水线都能够处理单个事务的一 部分。该设计最大化主机和闪存接口的使用,并允许单个事务被分解为许多小部分,这些小 部分可以被重新排序并被并行地处理,以提高性能。设计该结构来允许多个处理器在不使用代价高且无效率的中断的情况下执行它们的功能。并行流水线的使用允许控制器有效地掩盖闪存的使用中固有的写等待时间。此 外,多个独立处理器的使用提供足够的处理能力来处理由解决上述寿命和错误问题所施加 的系统开销。通过将主机发起的事务分解为大量独立闪存读写,这里所描述的控制器结构 允许在使用传统控制器设计中不可能的高水平性能。


图1图示包含SSD( “固态驱动器”)控制器和闪存的系统。图2图示用于将主机命令转换为闪存读和写的数据结构的分级结构。图3更详细地图示了图1的系统。图4以高级别图示了主机读操作。图5以高级别图示了主机写操作。图6图示闪存的组织。图7图示闪存组和闪存端口之间的关系。图8图示对闪存器件的输入和输出信号。图9图示对闪存HEMi块的输入和输出信号。图10图示闪存端口与闪存子组(bank)之间的连接。图11图示将CS和RB信号复用到单个引脚上。图12图示闪存分级结构。图13图示S页面区段的组织。图14图示闪存页面的构在。图15图示超级块(SuperBlock)内的数据的组织。图16图示数据的分条(stripe)组织。图17图示穿过主机端口的数据和控制流。图18图示主机端口。图19图示基元(primitive)匹配逻辑。图20图示命令解析器块。图21图示命令分布块。图22图示HEMi和共享RAM数据结构之间通过交叉切换器的连接。图23图示RAM控制器。图24图示共享RAM控制器与共享RAM子组之间的关系。图25图示DRAM信道。图 26 图示 HEMi 级。图27图示闪存HEMi及其紧密耦接的逻辑块。图28图示接收HEMi和传送HEMi唯一寄存器。图29图示闪存HEMi mRAM的内容。图30图示从共享RAM的数据块传输。图31图示ECC逻辑。图32图示数据路径DRAM的内容。
8
图33图示转发表。图34图示反转表。图35图示超级块元数据表。图36图示IOP数据缓冲器。图 37 图示 CDBinfo。图 38 图示 IOP。图39图示传输请求。图40图示页面请求。图41图示共享RAM块的内容。图42图示启动器信息。图43图示SLC闪存写定时。图44图示MLC闪存写定时。图45图示当接收到主机命令时主机端口遵循的步骤。图46图示⑶B的处理的初始阶段。图47图示特殊情况的⑶B处理。图48图示基于⑶Binfo设立IOP和传输请求的方式。图49图示闪存HEMi设立页面请求的方式。图50图示闪存HEMi的执行循环。图51图示页面请求读的处理程序。图52更详细地图示闪存读操作。图53图示页面请求写处理程序的执行。图54图示向页面请求分配超级页面。图55图示完成的事务的清理。图56图示垃圾收集处理。图57图示巡逻功能处理。图58图示重建处理。
具体实施例方式I.概述A.系统概述在当前的优选实施例中,这里所描述的系统被设计来以各种企业级大容量存储协 议操作,所述企业级大容量存储协议包括SAS( “串行附接SCSI”)、FC( “光纤信道”)以 及FC-AL( “光纤信道仲裁环”),所有这些都基于小型计算机系统接口( “SCSI”)与串行 ATA( “SATA”)协议。本领域的技术人员对这些协议都非常熟悉,因此这里不再描述。除了 特定协议被调用的情况之外,这里所公开的系统和方法不依赖于使用的特定协议,而是被 设计来以所有这些协议正确地操作。此外,这些系统和方法可以适应以其它现用的或还未 开发的类似协议的使用,包括为企业级应用设计的协议、以及为其它应用(诸如最终用户) 设计的协议。为了方便,这里的相关协议时常被统称为“SCSI协议”,但应该理解,它包括非SCSI协议,而不包括不相关的SCSI协议。这里所描述的系统包括用于控制包括闪存芯片的大容量存储模块的新颖结构。在 图1中以高度概述的形式示出了整个系统。与这里的其它框图一样,图1所示的元件本质 上是概念性的,它们示出了这些功能块之间的互相关系的性质,而不意在表示实际的物理 电路级实施。主机101和102是传统主机设备,例如使用大容量存储资源的两个服务器或为一 个这样的服务器服务的两个总线适配器。在某些协议中,每个主机可以支持多个启动器 (initiator)。在基于SCSI的系统中,启动器是主机侧的用于数据传输的端点,并且可以构 成单独的物理设备或处理。板103 (由虚线表示)表示一个或多个PCB。例如,其可以包括单个PCB板或以母 子结构连接在一起的多个板。在当前的优选实施例中,板103被设计为使得从主机101和 102的角度,板103呈现为构成传统的旋转盘大容量存储装置。这需要主机端口 104和105 被设计为它们在物理和逻辑上与传统大容量存储接口不可区分,其中已经为该传统大容量 存储结构设计了主机101和102。由此,在当前的优选实施例中,板103的使用不需要主机 101和102的任何重新设计。在当前的优选实施例中,SSD控制器106表示附接到板103的以200MHz运行的单 个集成电路器件。在替代实施例中,SSD控制器106可以由多于一个集成电路器件构成,而 不偏离这里描述的发明的原理。时钟速度当然表示一个实施选择,并将可以在实施中变化。在当前的优选实施例中,数据路径DRAM 107是64位宽的、256M字节的、具有 200MHz时钟速度的DDR SDRAM,该DDR SDRAM由爱达荷州博伊西的Micron技术公司出售, 产品型号为MT47H16M16BC-5E。它提供了每周期128位的数据传输的有效速度,由两个每 周期64位的传输构成。为了简化的目的,这里将其描述为128位接口。该器件自动检查所 有传输上的ECC。在涉及更大的总存储容量的替代实施例中,可以替代使用512M字节的、型 号为Micron MT47H32M16CC-5E的DDR SDRAM。应该理解,许多不同选择可以被用于数据路 径DRAM,包括使用不是DRAM的类型的存储器,并且,这里所识别的特定产品并非这里所公 开的发明的必要部分。如图1中所示,数据路径DRAM 107与SSD控制器106通信,但其不 具有与系统中任何其它元件的任何直接连接。闪存模块108表示许多闪存芯片。在当前的优选实施例中,闪存模块108包括192 个2G字节的NAND闪存芯片,每个芯片以40MHz运行。如以下所解释,该配置提供300G字节 的用户数据容量。应该理解,所描述的系统可以以更大或更小的总容量、具有比2G字节多 或少的容量的闪存芯片、以及以比当前优选的速度快或慢的速度操作的闪存芯片操作。此 外,闪存模块108可以包括多个叠放在一起的“子板”。闪存模块108与SSD控制器106通信,但其不具有与系统中任何其它元件的任何连接。如图1中所示,因为SSD控制器106与系统中的所有其它元件通信,而所述其它元 件互相都不通信,所以SSD控制器106占据了中心位置。下文将详细描述作为板103的部 分示出的每个元件的设计和操作。B.数据结构概述SSD控制器106通过从主机接收命令并将这些命令分解为最终导致闪存模块108中的读写序列的更小的任务而操作。图2在以高级别图示了该处理。当SSD控制器106接收到主机发起的读或写命令时,其创建被称为“⑶Binfo”的 数据结构(例如,CDBinfo 201),该数据结构包含命令描述符块(“CDB”)或其它相应的来 自主机的命令相关的信息。在其它信息之中,⑶Binfo在逻辑块地址(“LBA”)中指定了要 从中读取或写入到其中的地址范围。基于⑶Binfo,SSD控制器106创建被称为“输入输出处理”(“Ι0Ρ”)的数据结构 (例如,IOP 202)。在大多数情况下,单个IOP控制由主机请求的整个事务。每个IOP可以调用最多七个被称为“传输请求”的数据结构(例如传输请求 203-209)。每个传输请求被设计来处理由IOP指定的LBA范围的一部分。每个传输请求可以调用最多三个被称为“页面请求”的数据结构(例如,由传输请 求206调用的页面请求210、211和212 ;由其它传输请求调用的页面请求未在图2中示出)。 每个页面请求被设计来从或向对应于由传输请求指定的LBA范围的部分的闪存模块108的 段读或写。如图2所示,三个说明性的页面请求各自访问闪存模块108的被称为“超级页面 (SuperPage) ”的区域(例如,超级页面213、214和215)。如下面进一步描述的,每个超级 页面包括四个闪存页面,每个闪存页面被存储在不同的闪存电路小片(Die)中。下文将更详细地描述这些数据结构中的每个。C.详细的系统概述图3提供了图1所示的整个系统设计的额外细节,但,与前面一样,为了清楚,省略 了大量的元素和细节。图3示出了连接到板103的主机101和102,板103包括SSD控制器 106、数据路径DRAM 107以及闪存模块108。闪存模块108被分为八个闪存组,被指定为闪存组0-7。在这些之中,图中示出了 三个闪存组0、1和7,被指定为301、302和303。在当前的优选实施例中,闪存模块108可 以保持有八至十二个之间的闪存组。SSD控制器106还包含与存储模块108中包含的闪存组的数量相同数量的闪存端 口,例如闪存端口 304、305和306。每个闪存端口与一个闪存组通信(例如,闪存端口 0 304 与闪存组0 301通信)。与闪存组相同,在当前的优选实施例中,SSD控制器106可以具有 最少八个至最多十二个闪存端口,并且所示的实施例包含八个,其中示出了三个。如以下所 述,每个闪存端口独立地操作,由此支持闪存组中的并行操作。每个闪存端口包括闪存HEMi和级缓冲器(Stage Buffer)(例如,闪存端口 0 304 包括闪存HEMi 0 307和闪存级缓冲器0 308)。“HEMi ”代表硬件执行机器。HEMi是作为专 用的、特定目的的微处理器操作的逻辑块。下文将更详细地描述HEMi的设计和功能。每个 闪存HEMi控制针对单个闪存组的传输操作(例如,闪存HEMi 0 307控制闪存组0 301,闪 存HEMi 1 309控制闪存组1 302等)。闪存级缓冲器(例如,闪存级缓冲器0 308)被用来缓冲数据路径DRAM107和闪存 组之间的数据传输。在当前的优选实施例中,每个闪存级缓冲器是可以同时处理一次读和 一次写的双端口 SRAM,并且都能够保存表示四个闪存页面的16K字节数据。如下面所解释, 它构成数据的“超级页面”。如下面所描述,在当前的优选实施例中,来自每个闪存组的数据接口能够一次传送32位(一个双字),然而,数据路径DRAM 107能够一次发送或接收128位的数据(如上 所述,在当前的实施例中,数据路径DRAM以64位组块为单位传送和接收数据,但在每时钟 进行该操作两次,由此提供128位的有效的数据速率)。闪存级缓冲器缓冲闪存组和数据路径DRAM之间的通信,并因此允许传输在不需 要DRAM的部分上的等待状态的情况下发生。在当前的优选实施例中,在从闪存组向DRAM 传送的情况中,闪存级缓冲器以双字组块为单位接受数据。一旦接收了足够的数据量(优 选地,整个超级页面),闪存级缓冲器随后便在使用整个数据路径DRAM数据总线的DMA传输 中向数据路径DRAM突发(burst)传输数据。由处理向和从DRAM的DMA传送的DMA逻辑控 制闪存级缓冲器(见下文图10的讨论)。如图3所示,主机101和102与主机接口 310通信,应该理解,主机接口 310包括 主机端口 104和105 (未示出)。一般地,主机发出命令,提供要向大容量存储装置写入的数 据,并且从大容量存储装置请求数据。如本领域的普通技术人员所理解的,主机与大容量存 储通信的方式的细节是协议相关的。然而(且没有限制),典型地,主机使用包括命令和/ 或数据的“帧”与大容量存储装置通信。典型地,命令被包含在命令描述符块(“CDB”)中, 本领域的普通技术人员很熟悉CDB。主机接口 310被设计来以对主机透明的方式响应⑶B,这意味着从主机101的角 度,主机接口 310呈现为构成对传统大容量存储设备的接口。控制流如下进行(下文更详细地解释所提及的逻辑块和元数据结构中的每个) 在接收到请求读或写的⑶B时,主机接口 310产生用来处理操作的⑶Binfο (例如,⑶Binfo 201)。该CDBinfo接着被传递给命令解析器块(Command Parser Block) 311。在接收到⑶Binfo时,命令解析器块311执行一致性(coherency)与其它类型 的检查(将在下文描述),然后将⑶Binfo传递给命令分布块(Command Distribution Block)312。命令分布块312评估CDBinfo,并创建IOP (例如,IOP 202),来执行所请求的传输。 命令分布块312接着产生一个或多个传输请求(例如,传输请求203-209),每个传输请求用 来执行被IOP请求的传输的部分。对于每个传输请求,命令分布块312接着确定哪个闪存 组包括要被读取的数据,或者要写入的地址位置。命令分布块312接着将传输请求传递给对应于包含相关闪存地址的闪存组的闪 存端口,例如闪存端口 0 304、闪存端口 1 305以及闪存端口 7 306。当闪存端口从命令分布块312接收到传输请求时,用于该闪存端口的闪存HEMi将 传输请求分解为页面请求(例如页面请求210、211和212),并且使用页面请求来控制相关 联的闪存组中的实际的读和写操作,其中,每个页面请求最多访问超级页面的数据。因此,图3中用于闪存组0的读或写操作的的控制流如下进行。主机101 —主机 接口 310 —命令解析器块311 —命令分布块312 —闪存HEMi 0 307 —闪存组0 301。数据流不同地进行。在读的情况下,从闪存组向包含在所连接的闪存端口中的闪 存级缓冲器返回数据。例如,闪存级缓冲器0 308连接到闪存组0 301,闪存级缓冲器1 314 连接到闪存组1 302,以及闪存级缓冲器7 315连接到闪存组7 303。通过闪存级缓冲器,从闪存组获得的数据被通过总线316写入数据路径DRAM 107。从数据路径DRAM 107,数据经过主机接口 310到达主机101。写操作在相反的方向上进行主机101 —主机接口 310 —数据路径DRAM 107 —闪存级缓冲器0 308 —闪存组0 301。通过图3中连接各种元件的线图示控制流和数据流沿着不同的路径的事实。因 此,将闪存HEMi与闪存组连接的箭头象征了这些元件之间的控制流,而将闪存组与级缓冲 器连接的箭头指示了数据流。图3还示出了 RAM控制器317以及共享RAM块318,下文将更详细地描述它们中的 每一个。一般地,共享RAM块318包括被HEMi使用的存储器,RAM控制器317包含控制数 据路径DRAM 107和共享RAM块318的逻辑,并对这两个资源任意访问。D.读和写概述图4图示了用于由SSD控制器106处理的读操作的高级别数据流。在步骤401中,主机(例如,主机101)发出读命令,包括数据的LBA。在步骤402中,SSD控制器106在闪存模块108中识别所请求的LBA的位置,并向 闪存模块发出一个或多个读命令。在步骤403中,闪存模块108执行读操作,并将数据返回给SSD控制器106。在步骤404中,所返回的数据通过SSD控制器106,并被存储在数据路径DRAM 107中。在步骤405中,进行检查来确定是否已获得主机101所请求的所有数据。如果没 有(步骤405的“否”结果),则控制返回到步骤403,以便可以从闪存模块获得额外的数据, 并将其存储在数据路径DRAM中。一旦已经从闪存模块获得主机所请求的所有数据,并且这些数据都已经被存储在 数据路径DRAM中(步骤405的“是”结果),则在步骤406中,数据被从数据路径DRAM 107 读出到SSD控制器106中。在步骤407中,从SSD控制器106向主机101传送数据,由主机101请求的读操作结束。应该理解,图4使用高级别概念性的步骤描述了读操作,下文将解释它的细节。图5使用类似的高级别概念性的步骤来图示写操作,其中,主机101寻求在存储器 中存储数据。在步骤501中,主机101发出带有LBA的写命令,并且向SSD控制器106提供数据。在步骤502中,SSD控制器106在数据路径DRAM 107中存储要被写入的数据。在步骤503中,SSD控制器106在闪存模块108中识别LBA的位置。在步骤504中,SSD控制器106向闪存模块108发出足够读取包含LBA的超级页 面的读命令。该读命令不将数据存储到DRAM中,因此从图4的步骤403跳过步骤404向步 骤405进行,并且在这两个步骤之间循环直到接收到所有数据。在步骤505中,来自数据路径DRAM 107的数据被传输到控制器,并与从闪存模块 读取的数据集成。由于该集成,控制器现在保持一超级页面,在该超级页面中,新数据覆写 了在所述LBA处存储的旧数据,但该超级页面中的所有其它LBA不变。在步骤506中,SSD控制器106向闪存模块108发出写命令。在步骤507中,闪存模块108执行写操作。在步骤508中,进行检查,来确定是否已将所有信息写入闪存模块108中。
如果需要额外的写操作(来自步骤508的“否”结果),则控制返回到步骤507。如果所有数据都已被写入闪存模块108 (来自步骤508的“是”),则在步骤509中, SSD控制器106为所写入的LBA更新位置信息。如下文将详细解释的,由于闪存的性质, 写操作并不物理地覆写现有的超级页面,而是将更新的超级页面写入闪存模块108的新地 址,从而需要对与存储在该超级页面中的LBA关联的地址转换信息的更新。然后,写操作完成。II.闪存结构A.物理存储器结构图6图示了一个闪存组(例如,闪存组0 301)的组织、以及其与所关联的闪存端 口(例如,闪存端口 0 304)的关系。应该理解,该组织的细节在不同的实施例中可以不同。闪存组301包括八个闪存芯片,指定为601-608。每个闪存芯片包括两个电路小 片;例如,闪存芯片601包含电路小片609和610。在一个实施例中,每个电路小片(例如,电路小片609)具有约1. IlG字节的原 始容量(raw capacity),包括8224个块,每个块包括64个页面,每个页面包括2212个字 节。当去除了系统和备用(spare)存储空间后,留给用户约每个电路小片IG字节的数据容 量,或每个NAND闪存芯片2G字节的容量。在包括十二个闪存组以及每个闪存组八个子组 (bank)的系统中,提供了约384G字节的原始用户存储空间,但对于用户数据总共可用的空 间约为300G字节,这是因为某些空间被用于备用和系统功能,它们不落入用户可用的LBA 地址空间内。系统空间存储各种类型的系统元数据,包括SCSI模式页面,系统空间还含有 空闲空间。各自包含两个IG字节的电路小片的2G字节的NAND闪存芯片的使用,是可用闪存 技术的现有技术状态的反映。所描述的系统以其它闪存大小和配置可以同样好地操作,包 括在一个闪存芯片中包含四个电路小片,或每芯片一个电路小片。因为下一代的NAND闪存 芯片将每芯片合并四个电路小片,所以,很可能闪存组301将使用这种芯片。这里所描述的 原理可以简单地应用于四电路小片的设计。例如,如果四电路小片芯片中的每个电路小片 具有自己的CE和RB引脚,但所有四个电路小片共享公共地址/命令/数据引脚,则每个电 路小片可以被合并到单独的子组中。另一方面,如果每个四电路小片芯片具有两个CE和RB 引脚,其中两个电路小片共享每个引脚,则从SSD控制器106的角度,共享公共CS和RB引 脚的两个电路小片将表现得与上述的单个电路小片(例如,电路小片609)不可分辨。当前的优选实施例采用IG字节的NAND闪存芯片也同样好地操作,每个所述NAND 闪存芯片包含2个半G字节的电路小片。在该配置中,每个电路小片仅包含4112个块。除 容量外,该配置与上述配置相同地操作。注意,闪存芯片自身是传统设计,并且,图6中的图示并不意在传达这些芯片的内 部设计的细节,而是考虑对芯片的组织以及电路小片与系统其余部分接口方式的理解。闪存组301被分为四个子组(611、612、613以及614),每个子组包括四个电路小 片。因此,子组611包括来自闪存601的电路小片609、来自闪存602的电路小片615、来自 闪存603的电路小片616以及来自闪存604的电路小片617。子组612包括来自闪存601 的电路小片610、来自闪存602的电路小片618、来自闪存603的电路小片619以及来自闪 存604的电路小片620。子组613和614在其它闪存和电路小片中被类似地组织。
14
图6示出了四个子组。在当前的优选实施例中,取决于用户所期望的容量,每个闪 存组包括四至八个子组。图7提供关于闪存模块108、SSD控制器106与数据路径DRAM 107之间的互联的 额外细节。虽然图7示出了闪存组0 301与闪存端口 0 304,但相同的互联存在于所有闪存 组与它们伴随的闪存端口和数据路径DRAM 107之间。如图7所示,闪存组0 301通过两个总线(闪存总线701与CS/RB总线702)连接 到闪存端口 0 304。CS/RB总线702包括将闪存HEMi 307连接到每个闪存组301的子组的单独的线。 在所示的具有四个子组的实施例中,CS/RB总线702包括四条线线703,将闪存HEMi 307 与子组614连接;线704,将闪存HEMi 307与子组613连接;线705,将闪存HEMi 307与子 组612连接;以及线706,将闪存HEMi 307与子组611连接。在包括更多数量的子组(例 如,八个)的实施例中,CS/RB总线702将包括相应的更多数量的信号。应该理解,来自闪 存HEMi307的信号通过SSD控制器106上的引脚传播。图7不意在示出传送路径的物理细 节,而是图示数据和控制信号流。CS/RB总线702的线携带从闪存组301向闪存HEMi 307的准备好-忙碌(“RB”) 信号、以及从闪存HEMi 307向闪存组301的芯片选择(“CS”)信号。在任何给定时间,CS/RB总线702上携带的CS信号中的仅一个是有效的。连接到 当前有效的CS信号上的子组连接到闪存总线701,并且所有其它子组从该总线断开(再次, 这是逻辑或者非物理概念;根据该实施,“连接的”子组可以与闪存总线通信,而所有其它子 组忽略闪存总线,即使闪存总线和所有子组之间存在物理连接也是如此)。在闪存总线701上将来自闪存HEMi 307的地址和控制信息传送到每个子组。其 包括控制信号708 (下文结合图8描述)与地址/命令信号709 (下文结合图9描述)。类 似地,总线707将闪存级缓冲器308连接到闪存总线701。在总线707上,从级缓冲器308 沿着闪存总线701向子组传送数据。在相反方向从子组向级缓冲器308传送数据。如图7进一步所示,数据路径DRAM 107连接到级缓冲器308。因此,数据从数据路 径DRAM 107向级缓冲器308传递,然后被沿着总线701向具有当前有效的CS信号的子组 发送。来自闪存组301的数据被沿着相反路径传送到数据路径DRAM 107。图8示出单个闪存芯片(例如,包括电路小片609和610的闪存芯片601)的引脚 输出部分。在当前的优选实施例中,闪存芯片使用标准的NAND闪存接口,典型地在相关部 分(in relevant part)包括8位的地址/数据(801),4位的控制(地址锁存使能(“ALE”) 信号802、命令锁存使能(“CLE”)信号803、写使能(“TO”)信号804以及读使能(“RE”) 信号805,它们被统称为控制信号708),每电路小片一个芯片使能引脚(其连接到来自控制 器的CS信号,并且有时将可以互换地使用标示“芯片使能”和“芯片选择”),以及每电路小 片一个准备好/忙碌线。如所示的,A/D信号801与ALE、CLE、WE和RE信号全连接到闪存 总线701,然而它们不是仅有的连接到该总线的信号。如图8所示,ALE、CLE、TO、RE与两个芯片使能信号是向闪存601的输入。A/D总 线801由八个双向信号构成。所述两个RB信号是输出。除了两个CE和两个RB信号之外,图8中所示的所有信号都被所述两个电路小片 共享。因此,电路小片609与610共享相同的八个A/D弓丨脚801。从图6的讨论应该理解,这些电路小片每个都在单独的子组中。因此原因,引脚的共享不产生冲突,因为这些信号绝 不可能同时对于多个子组有效。作为闪存所典型的,每个电路小片具有所关联的闪存页面缓冲器,该缓冲器可以 保持正被写入相应电路小片或从相应电路小片读出的一页面数据。图8将它们示出为页面 缓冲器806和807。图9图示了闪存HEMi (例如,闪存HEMi 307)专用于闪存端口(例如,闪存端口 0 304)的信号输出的部分。应该理解,闪存HEMi 307还具有额外的专用于其它功能的输入 和输出。如上所解释,通过SSD控制器106的引脚,来路由将闪存HEMi 307与闪存组连接 的信号。这些引脚与处理该路由的逻辑都未被示出。如其它示出信号路由的图中确切的那 样,图9意在作为概念性阐述,而不意在示出实际物理布局的细节。闪存HEMi 307的接口的该部分由专用于以下功能的信号构成1.控制信号708,其由四条控制线构成ALE信号802、CLE信号803、TO信号804 以及RE信号805。这些信号是从闪存HEMi 307的输出。2. CS/RB总线702,其由CS/RB线703-706构成。如以上所解释,每个闪存HEMi可 以每连接的CS/RB线控制一个闪存子组。因此,在图9所示的实施例中,闪存HEMi 307控 制四个闪存子组(例如,图6中所示的子组611、612、613、614)。在每闪存组包括八个子组 的系统中,每个闪存HEMi将具有八个专用于该目的的信号(注意,支持额外四个信号所必 需的逻辑即使在这些信号实际上不被使用的情况下也存在)。CS/RB总线702从HEMi 307向闪存子组传送CS信号,并且从闪存子组向HEMi 307 传送RB信号。因为信号以这种方式被复用,所以,每个这样的线一次仅可以传送一种类型 的信号。CS/RB信号是“一个热(one hot) ”信号,S卩,在任何给定时间点,这些信号中的一 个且仅有一个可以是有效的。为CS和RB目的两者使用相同的信号在SSD控制器106上节约了引脚,并因此降 低了 SSD控制器的成本与复杂度。然而,这限制了可以由闪存HEMi307控制的子组的数量, 这是因为每个子组需要一个RB信号以及因此的一个引脚。因为在当前实施例中,SSD控制 器106对于每个闪存端口包括八个CS/RB引脚,所以在该实施例中,每个闪存HEMi最多可 以控制八个子组。3.构成地址/命令信号709的31个信号。连接到闪存总线701的该总线以与闪 存芯片相同的40MHz的速度运行,并且携带从闪存HEMi 0 307向闪存组0 301的地址和命 令。地址/命令信号709可以被认为作为四个单独的八位总线(包括线0-7、8-15、16-23 以及24-31),所述八位总线中的每个向闪存子组中的单独电路小片路由八位有效载荷。因 此,来自地址/命令总线709的八条线连接到A/D信号801,如图8所示。根据前文应该清楚,SSD控制器106的44个引脚被专用于每个闪存端口(记住, 每个闪存端口可以支持最多八个子组,并因此需要八个CS/RB引脚,虽然图9中仅示出了四 个这样的信号)。因为SSD控制器106可以支持最多12个闪存端口,所以SSD控制器106 的528个引脚被专用于闪存接口,然而如果使用少于12个的闪存端口,则这些引脚中的某 些可以是无连接的。注意,如果需要单独的CS和RB引脚,则对于闪存接口还将需要额外的 96个引脚(每个子组1个引脚X 8个子组X 12个闪存端口 )。因此,将CS和RB信号组合 到单个引脚上在所需引脚的数目上提供了显著的节约。
虽然图9所示的实施例是当前优选的,但各种其它实施例也是可能的。在不同的 实施例中,当前专用于特定闪存组的八个CS/RB引脚连接到位于闪存组中的复用器或其它 类似逻辑器件。该复用器随之具有一组连接到子组中的所有闪存电路小片的CE输入的输 出信号,其中每个信号引起对特定子组的CE输入的选择。因为该八个SSD控制器CS/RB引 脚在理论上能够传送256个单独状态,所以,可以通过设计该复用器或其它逻辑、以便为所 述256个可能的输入状态中的每个产生沿着不同输出线的信号,使用这些引脚在256个单 独子组之中选择。然而,因为在当前实施例中,所有子组共享同一 A/D总线,所以加入这么 大数量的子组将没有或几乎没有益处。替代地,在更期望的实施例中,这种复用器或其它类 似逻辑可以被用于加入中等数量的子组(例如八个),或被用于降低每子组的CS/RB引脚的 数量(例如,从八个到四个)。注意,在该替代实施例中,因为CS/RB引脚的数目比子组的数目少,所以CS/RB引 脚不可以再为每个子组处理RB信号。因此,在该实施例中,SSD控制器CS/RB引脚不再处 理RB输入。然而,因为标准闪存芯片支持RB状态的仅软件状态检查,所以每个闪存HEMi 可以使用A/D总线检查子组的RB状态。因此,该替代实施例允许SSD控制器106将更少的引脚专用于闪存接口或利用相 同数量的引脚支持更大数量的子组,然而,代价为某个附加的逻辑复杂度。图10图示了单个子组中的电路小片(例如,子组611中的电路小片609、615、616 和617)连接在一起、并连接到所关联的闪存端口(例如,闪存端口 0 304,包含闪存HEMi 307和级缓冲器308)的方式。如图6所示,电路小片609是闪存芯片601中的两个电路小片之一,电路小片615 是闪存芯片602中的两个电路小片之一,电路小片616是闪存芯片603中的两个电路小片 之一,以及电路小片617是闪存芯片604中的两个电路小片之一。为了图示的简单,图10 仅示出了每个闪存芯片中的两个电路小片之一(如上所述,存储模块108可以很好地合并 具有四个(或更多)电路小片的闪存芯片,而这里所公开的设计的原理将保持相同)。如所示,线706构成闪存HEMi 307与子组611之间的CS/RB信号接口。该线携带 从闪存HEMi 307向子组611的CS信号,以及从子组611向闪存HEMi 307的RB信号。图 10通过显示在闪存HEMi 307向线706上的点1001之间的双向上前进的箭头图示了这一 点。从点1001,信号路径分路,并且携带CS信号作为向电路小片的输入(由指向每个电路 小片的、带有标记“Cs”的箭头示出),以及携带RB信号作为从每个电路小片的输出(由从 每个电路小片指出的、带有标记“RB”的箭头示出)。应该理解,点1001本质上是象征性的, 并且,不论是它还是该图的其余部分都不意在作为物理实施的直接图示。如所示,来自子组中的每个电路小片的RB输出信号一起被进行逻辑“或”(或其它 类似地组合),从而,如果子组中的四个电路小片中的任何一个输出“繁忙”,则从子组611 沿着线706向HEMi 307发送繁忙信号。线706还携带从闪存HEMi 307向子组中的每个电 路小片的CS信号。当专用于子组的CS信号被通过闪存HEMi 307设置时,该信号被同时发 送到子组中的每个电路小片的CE引脚,由此,同时选择每个这样的电路小片。图10还示出地址/命令总线709,其表示闪存芯片601-604的A/D引脚与HEMi 307的地址/命令信号之间的连接。如所示,32位的总线709携带从闪存HEMi 307向总线 切换器1002的信号。总线切换器1002表示如所述地组合、分路和路由信号的逻辑,并且不一定构成单个物理切换器。总线切换器1002将来自总线709的信号分路为子总线。使用8位的总线801将 信号0-7传送到闪存芯片601的A/D引脚(还如图8所示),使用8位的总线1003将信号 8-15传送到闪存芯片602的A/D引脚,使用8位的总线1004将信号16-23传送到闪存芯 片603的A/D引脚,以及使用8位的总线1005将信号24-31传送到闪存芯片604的A/D引 脚。注意,A/D引脚被闪存芯片中的所述两个电路小片共享,从而将可以由合适的电路小片 以对闪存芯片的内部设计特定的方式接收传送到闪存芯片引脚的信号。图10还示出了闪存HEMi 307的控制信号708与每个电路小片之间的连接。如上 所示,这些控制信号包括ALE、CLE、RE与TO,并且它们被从闪存HEMi 307传送到闪存电路 小片。控制信号708被从闪存HEMi 307发送到总线切换器1002。从总线切换器1002,控 制信号(在每个情况中都被标记为708)的相同集合被传送到每个闪存芯片。与A/D引脚 一样,ALE、CLE、RE与TO引脚被每个闪存芯片中的两个电路小片共享。图10还示出闪存缓冲器308,其通过32位的总线707连接到总线切换器1002。与 总线709不同,总线707是双向的,并因此在双向上传送数据。在级缓冲器308与电路小片之间的传输在级缓冲器DMA控制器1006的控制下发生。注意,闪存级缓冲器308还连接到闪存芯片的RE和TO输入。这些连接被用于控 制DMA操作,为了清楚,图中未示出这些连接。总线切换器1002将来自总线707的信号分路为八位信号的四个集合,并且使用8 位总线801、1003、1004和1005将这些信号传送到电路小片609,615,616和617。类似地, 总线切换器1002在8为总线801、1003、1004和1005上从电路小片609,615,616和617接 收数据,然后在总线707上将整个32位值传送到级缓冲器308。因此,切换器1002在相同的8位总线上复用来自闪存HEMi 307的信号,以及去向 和来自级缓冲器308的信号。切换器1002根据读或写周期的特定阶段,利用来自在所述周 期的一个阶段中连接到电路小片的闪存HEMi 307的地址信息,确定哪个集合的信号通过 到8位总线,然而,去向或来自级缓冲器308的数据在所述周期的不同阶段连接到该8位总 线(再次,如上所述,切换器1002本质上是概念性的,并且不一定构成单个专用切换器。此 外,也可以在其它逻辑块中发现所描述的与切换器1002联系的功能的方面)。图10仅示出单个闪存子组611。在实际的实施例中,总线切换器1002可以与闪 存组中的每个闪存子组接口,并且每个接口都可以复制除信号706外的所有从总线切换器 1002向子组611输出的信号(如图10中所示),如上文所解释,信号706专用于子组611。 还如上文所解释,闪存切换器1002将总线707、708和709连接到每个闪存子组,但仅响应 的子组是与来自闪存HEMi 307的当前有效CS信号关联的子组。注意,闪存总线701包括总线708、801、1003、1004和1005。图11更详细地示出了与线706相关的CS和RB逻辑。如所示,SSD控制器CS/RB 引脚1101连接到与闪存电路小片609和615关联的RB和CE引脚上。如上联系图6所述, 电路小片609和615是子组611的四个电路小片中的两个。为了图示的目的,未示出子组 中的其它两个电路小片,但其以与电路小片609和615相同的方式连接。SSD控制器106将CS/RB引脚1101驱动到高来选择子组611。该信号被反转器
181102反转,并被子组中的电路小片的CE引脚接收为低。这些引脚是以低为有效的。当SSD控制器106将相同闪存组中的另一 CS引脚驱动为高(由此选择该闪存组 中的另一子组)时,CS/RB引脚1101被SSD控制器106驱动为低。当闪存HEMi 307想要读子组611的准备好-繁忙状态时,SSD控制器106浮接CS/ RB引脚1101。当CS/RB引脚被SSD控制器浮接时,如果闪存电路小片RB引脚的任何一个 正在驱动指示该子组繁忙的低信号,则CS/RB引脚将接收低输入,这是因为任何电路小片 RB引脚上的低输出将优先于上拉1103。另一方面,如果子组在准备好的状态中,则闪存电 路小片允许PB引脚浮接。因为上拉1103连接到RB引脚,所以,当所有这些引脚都浮接时, 并且当CS/RB引脚1101被浮接时,该CS/RB引脚接收到高输入信号,这指示该子组已准备 好。因此,该电路以“或”结构将子组的R/B引脚连接在一起,这是因为,为了 CS/RB引 脚1101接收到准备好的信号,所有引脚都必须在准备好的状态(浮接),从而该电路有效地 将这些引脚的繁忙状态一起进行“或”操作。反转器1102的使用允许SSD控制器106驱动 CS信号为高来选择子组,即使该子组的CE引脚是以低为有效的。因为必须将CS信号驱动 为高、以便优先于传入的RB信号,所以,这是必要的。以该方式,向SSD控制器106的RB输 入可以是以高为有效的,但是,因为高CS输出将优先于由上拉1103生成的高RB输入,所以 CS/RB引脚1101上的高输出仍然可以优先于其。B.逻辑存储结构诸如101和102的主机典型地以逻辑块地址(或“LBA”)组织存储器。当主机向 大容量存储装置写入数据时,虽然主机通信的细节根据主机所使用的特定协议而变化,但 主机典型地传送包含写命令和LBA的CDB。当主机随后希望读数据时,它发出使用相同LBA 的读命令。典型地,主机的存储结构将数据分为数百万个LBA,每个LBA被从LBAO开始顺序 编号。如本领域的技术人员所熟悉的,主机将经常与大量大容量存储控制器通信,并将主机 整个LBA范围的子集分配给每个控制器。在当前的实施例中,SSD控制器106响应于从LBA 0开始、以该控制器可寻址的最高LBA结束的LBA范围。将LBA序列映射到更大的主机LBA 地址空间上是主机或主机总线适配器的责任,并且对SSD控制器106是透明的。图12图示了当前优选实施例中、在闪存模块108中使用的存储器分级结构。每个闪存组由许多子组(例如,子组611)构成。每个子组包括许多块,标记为块 0-块η(例如,块0 1201)。如闪存系统中所普遍的,块表示能够以单次操作擦除的闪存段。子组中所存储的块的确切数量与实施相关。例如,在提供300G字节可用用户数据 的系统中,根据各种因素,包括缺陷管理与留为空闲空间的存储量,每个子组的块的数量一 般将在7000-9000的范围中。如图12中所示,每个块包括64个超级页面,标记为超级页面0-63。如以上所解释 的,每个超级页面包括四个闪存页面(例如,超级页面30包括页面30 1202、页面30 1203、 页面30 1204以及页面30 1205)。页面1202、1203、1204与1205被存储在相同闪存子组 中的四个不同闪存电路小片上的相同地址位置。因此,超级页面30横跨四个单独的电路小 片。如闪存系统中作为标准的,每个页面表示可以从其读出或写入到其的闪存的最小增量。如图12所示,每个页面存储十五个被称为P区段(PSector)的存储段,标记为P区段0-14。图12还示出额外的存储结构S页面(SPage)区段01206。如所示,S页面区段0 包括四个P区段0,每个页面上一个。S页面区段0 —般对应于经典的大容量存储区段,但物理上横跨四个P区段,其中 每个被存储在相同子组上不同电路小片的相同地址中。当前的优选实施例还使用图12中未示出的额外存储结构超级块(SuperBlock), 其由闪存组中的每个子组上的相同块构成(例如,块0 1201是闪存组的超级块0的部分)。在所描述的实施例中,与特定LBA关联的数据和元数据被存储在单个S页面区段 中(例如,S页面区段1206),并且在这里被称为区段内容,由区段数据和区段元数据构成。图13图示超级页面区段的组织,例如,S页面区段1206。整个S页面区段在闪存 中包括556个字节。每个S页面区段被分为四个P区段,每个包括139个字节,每个在不同 的闪存电路小片上。在所示的例子中,S页面区段1206的528个字节被分配给数据,如区段数据字段 1301所示。不同的主机协议将不同数量的数据与单个地址关联,从而,根据所使用的协议, 区段数据字段1301可以小至512字节。如图13中所示,在当前的优选实施例中,每个S页面区段还包括8字节的端到端 (“E2E”)信息(字段1302)和20字节的ECC信息(字段1303)。这些字段共同组成区段 元数据。通过SCSI协议的较新的版本指定E2E信息。该信息可以被启动器用来追踪数据 和确保由大容量存储设备返回的数据与所请求的数据匹配。ECC信息被用于错误校正的目 的。E2E字段1302进一步被分为参考标签(RefTag)字段1304、应用标签(AppTag)字 段1305以及CRC字段1306。参考标签字段1304包括四个字节并包含可以被启动器与区段数据关联的地址。 SCSI协议不需要参考标签支持(并且,参考标签支持不是该协议较早版本的一部分),因此 启动器可以使用也可以不使用参考标签。如果启动器确实使用参考标签,则与参考标签字 段1304关联的值被从CDB中取得,该CDB触发了区段内容的原始写入。典型地,该值与LBA 相同,然而,启动器可以分配不同的参考标签。启动器可以选择使为在相同写入中的每个后 续区段的参考标签值递增,或者为与单个写入关联的所有区段分配单个参考标签值。如果 选择递增选项,则SSD控制器106基于初始参考标签值与所接收的区段的数量来执行该操 作。如果启动器不支持参考标签的使用,则SSD控制器106在参考标签字段1304中填 充LBA地址。不论启动器是否请求参考标签的使用,该字段都被SSD控制器106用于内部 错误检查的目的。存储在参考标签字段1304中的值应该匹配任何引起后续的向分配给该S页面区 段的任何LBA读或写的⑶B的参考标签值(如果启动器未分配参考标签,则参考标签值应 该匹配基于CDB的LBA)。如果两个值不匹配,则其指示某种类型的错误,该错误可以源自 所接收的参考标签中的错误、参考标签字段1304中的数据破坏、或者由SSD控制器106用 来选择S页面区段1206作为用于读或写的合适的目标的地址转换表中的问题。如果检测到,则这样的情形导致向主机发出合适的SCSI感测码(sense code),其指示事务失败(或 其它类似的通信,取决于所使用的协议)。应用标签字段1305包括两个字节,并被用于启动器指定的、与创建所关联的区段 数据的特定应用相关的信息。SCSI协议支持应用标签信息,但并不需要它。如果启动器未 提供该信息,则用所选择的缺省值填充应用标签字段1305,以便该缺省值将不重叠任何由 确实支持使用应用标签的启动器分配的有效应用标签值。如与参考标签值一样,可以相对由启动器提供的作为部分读命令的应用标签来检 查关于从闪存接收的数据的应用标签信息,其中失配指示错误。CRC字段1306包括两个字节,并包含循环冗余校验(“CRC”)数据,CRC数据被用 于检查存储在S页面区段1206中的数据和元数据的完整性。如与参考标签和应用标签信 息一样,可以相对从启动器接收的值检查CRC标签,以确定该数据与元数据是否正确。SCSI协议允许启动器请求对任何或所有三个E2E的值的检查。ECC字段1303包含错误校正码(“ECC” )信息,ECC信息可以被用于校正LBA数 据和区段元数据中的错误。下面联系图31描述在优选实施例中使用的ECC检查。返回图12,在当前的优选实施例中,每个页面(例如,页面1202)包括2212个字节 的闪存空间,并包括15个P区段(每个情况下都被标记为P区段0-14)以及元数据(未示 出)。在当前的优选实施例中,构成S页面区段的四个P区段中的每个都存储在所述S 页面区段中存储的区段内容的四分之一。以字节交错为基础在P区段之间分配数据。因此, 区段内容的第一个双字的第一个字节被写入页面1202的P区段0的第一个字节,第一个双 字的第二个字节被写入页面1203的P区段0的第一个字节,第一个双字的第三个字节被写 入页面1204的P区段0的第一个字节,第一个双字的第四个字节被写入页面1205的P区 段0的第一个字节,第二个双字的第一个字节被写入页面1202的P区段0的第二个字节,寸寸。根据该解释应该理解,存储在S页面区段0中的区段内容在四个P区段0中展开。 因此,所述四个页面中的每个存储区段内容的四分之一,或139个字节(556/4)。图14以额外的细节图示了闪存页面1202,示出了图12中未示出的元素。在典型 的闪存结构中,闪存页面包括2048个字节的数据和/或元数据、以及额外的用于其它目的 的64个“备用”字节,加起来一共2212个字节。在当前的优选实施例中,另一方面,虽然每 个页面包括2212个字节,但这些字节中的2085个被用于区段内容(15 X 139),而额外的27 个字节存储与超级页面关联的元数据。图14示出了包括2085个字节的P区段0-14,以及 包括每闪存页面27个字节的超级页面元数据1401。如与P区段一样,超级页面元数据横跨 构成超级页面的所有四个闪存页面展开,从而超级页面元数据字段1401存储与该超级页 面关联的元数据的四分之一。超级页面元数据1401包括S页面索引(index) 1402与时间戳1403。S页面索引 1402将索引存储到被称为“转发表(Forward Table) ”的表,该表包含用于LBA的物理位置 信息。下文联系图33描述转发表。时间戳1403包含表示超级页面被写入的时间的时间戳。S页面索引和时间戳被冗余地写入构成超级页面的四个闪存页面的每个中。因为
21该元数据不被保护其它信息的ECC机制保护,所以该冗余是必需的。当写入超级页面时,由闪存HEMi填入超级页面元数据1401。闪存HEMi从发起该 写入的页面请求中获取S页面索引,并且从内部时钟获取时间戳信息。超级页面元数据被 用于在不可预见的掉电(power loss)之后重构开放的超级块。下文联系图58描述掉电重 构。图15图示了在子组的块0和块1之间组织区段内容的方式。应该理解,对于存储 在子组中的所有剩余块,遵循相同的组织。每个S页面区段存储与单个LBA关联的区段内容,并且,超级页面的S页面区段存 储与十五个连续的LBA关联的区段内容。然而,如下文所解释,与一个超级页面关联的十五 个连续LBA可以和与下一个超级页面关联的十五个连续LBA没有关系。通过由字母识别LBA来图示该组织。因此,LBA㈧指示特定地址,并且LBA (A+14) 指示比LBA (A)高14个LBA的地址(例如,如果LBA (A)是LBA (0),则LBA (A+14)将是 LBA(14))。然而,在LBA㈧和LBA⑶之间没有关系,例如,除了每个将可以被15整除。因 此,LBA (A)可以表示 LBA (9000),而 LBA (B)可以表示 LBA (60)。注意,存储在每个超级页面中的LBA将在操作期间变化。例如,在一个点上,子组0 的超级页面1的S页面区段0可以存储与LBA(O) (B = 0)关联的区段内容,而在另一点上, 其可以存储与LBA(900) (B = 900)关联的区段内容。下文描述LBA与超级页面和子组的关 联在使用中变化的方式。图16图示在初始化期间主机地址空间被映射到闪存模块108上的方式。如以上 所述,主机典型地使用LBA发出读和写,LBA将主机与物理存储器组织的细节隔离。在当前的优选实施例中,每个闪存组具有相同的大小,并且每个存储对应于相同 数量的LBA(或其它主机寻址方案)的数据。在当前的实施例中,因为如下面所描述,45个 LBA是单个传输请求所能处理的最大数量,所以在闪存组之间以45的倍数的集合分布LBA。 当前的优选实施例使用90个LBA的分条(stripe)大小,从而LBA 0_89被分配给闪存组0, 90-179被分配给闪存组1,LBA 180-269被分配给闪存组2等,直到到达最后的闪存组为止, 在该点上,LBA分配循环回到闪存组0。各种其它分条算法是可能的。在可选实施例中,可 以允许用户指定分条大小,然而,优选以传输请求能处理的LBA的数量的倍数进行其。图16示出闪存空间的简化版本。该简化版本由三个闪存组(标记为0-2)构成。 在该简化示例中,一个块包括两个超级页面,标记为SPO和SPl。因此,闪存组0的子组0的 块0包括写入标记为1601的存取位置(slot)的数据。可以看出,在该简化示例中,每个子 组仅包含单个块。如上所述,超级块包括每个子组上相同的块。因此,在图16所示的简化结构中,闪 存组0的超级块0包括来自每个子组的块0,在图16中标记为1602 (在该简化示例中,即整 个闪存组)。如下所述,每个超级块的块0的超级页面0包含被称为超级块元数据表 (SuperBlock Metadata Table)的数据结构。在每个闪存组的子组0的SPO中将其示为 "SMT "ο表中所有其它方格表示存储在特定超级页面中的LBA范围。因此,闪存组0的子 组1的超级页面0包含LBA 0-14,闪存组0的子组1的超级页面1包含LBA 300-314,等。
可以看出,LBA被分配在各自有90个LBA的“分条”中。第一个这样的分条(LBA 0-89)被分配给闪存组0的子组1-6上的超级页面0。下一个90个LBA (90-179)的分条被 分配给闪存组1的子组1-6上的超级页面0。下一个分条(LBA 180-269)被分配给闪存组 2的子组1-6上的超级页面0。在该点,因为已经到达最后一个的闪存组(在该简化示例中),所以下一分条被写 入闪存组0,在前一分条停止的地方开始。因此,LBA 270-284被写入闪存组0的子组7的 超级页面0。因为在闪存组0中不再有超级页面0可用,所以分条的分配以子组0的超级页 面1继续,并继续到子组4的超级页面1。除了当到达超级块的末端时的边界情况外,从该点的分配是直接易懂的。例如,新 分条从闪存组0的子组5的超级页面1开始。因为在超级块中仅剩三个超级页面,所以该 分条在闪存组1的子组5的超级页面1上继续。在该方法中,尽管超级块不保持相同数量 的分条,但LBA仍被分配给每个超级块中的每一个超级页面。分配LBA的该方法倾向于最大化闪存的并行性。因为每个闪存组独立地操作,所 以,横跨闪存组来对LBA进行分条具有优势,因为其最大化单个事务将寻址在多于一个闪 存组中保持的数据的可能性,由此允许与事务相关的多个闪存读或写同时发生。因为传输 请求仅可以在单个闪存组上寻址LBA,所以,以45 (可以被传输请求寻址的LBA的最大数 量)的增量指定分条大小,从而最小化事务所需要的传输请求的数量是合理的。在当前的 实施例中,由两个这样的45-LBA增量构成分条,这是因为其表示六个超级页面。如下所述, 闪存组可以处理五个单独子组上的五个同时的写操作。由于大的传输可以在每个闪存端口 执行五个同时的写,并且可以并行地在多个闪存端口上执行,所以,使用90个LBA的分条大 小倾向于最大化闪存接口的并行使用。因此,该组织贡献了 SSD控制器106使用高度并行 性快速处理主机发起的大的读或写的能力。因此,如图16中所示的涉及LBA 0-190的假想传输可以使用一个IOP和五个传输 请求发生。第一个传输请求可以处理LBA 0-44,第二个传输请求可以处理LBA 45-89,第三 个传输请求可以处理LBA 90-134,第四个传输请求可以处理LBA 135-179,第五个传输请 求可以处理LBA 180-190。注意,该传输涉及三个不同的闪存组,由此允许高度的并行性。 此外,因为(如下文所解释)目标为不同子组的页面请求可以并行地甚至在相同的闪存组 上操作,所以,在该示例中,因为每个页面请求目标为不同的子组,所以,由每个传输请求发 出的页面请求也可以并行地操作。LBA向闪存组的分配是永久性的。然而,向闪存组内的子组的分配可随着时间变 化。如下文所解释,当对某个LBA接收到主机写、因此需要包含该LBA的超级页面失效并且 将新数据(以及来自该超级页面的任何未被覆写的旧数据)写入新超级页面时,闪存HEMi 尝试使用来自与旧超级页面相同的子组的新超级页面。然而,有时这不可能,并且,闪存 HEMi将把LBA移动到另一子组上的超级页面。这将倾向于影响闪存系统的性能,因为,如果 足够的这种转变发生,则数据的分条可能被集中在单个或相对小数量的子组上,因此,降低 并行操作的机会。然而,实际中,从子组向子组的转换倾向于以无规则(patternless)的方 式发生,从而,即使在重大操作之后,在给定分条中的LBA组也倾向于横跨这些子组,从而 可以保持高度的并行性。III.硬件细节
A.主机接口图17比图3中所示更详细地示出了主机接口 310。主机接口 310包括物理接口 1701以及两个单独的主机端口,被标记为主机端口 0 104和主机端口 1 105。下文进一步 描述物理接口 1701,但为了当前目的,理解其在主机101和102以及主机端口 104和105之 间路由信号就足够了。每个主机端口能够与单独主机对接。一般地,主机接口 310在接收侧执行以下功能接收帧将帧解构为要素特征将命令信息传递到下一级将数据传递到数据路径DRAM一般地,主机接口 310在传送侧执行以下功能从数据路径DRAM 107接收数据,并组织用于向主机传送的数据产生用于向主机传送的帧向主机传送包括数据帧的帧每个主机端口包括接收HEMi (1702和1703)、传送HEMi (1704、1705)、接收级缓冲 器(1706、1707)以及传送级缓冲器(1708、1709)。如所示,每个接收HEMi从一个主机通过物理接口 1701接收控制信息,并向SSD控 制器106的其它元件传递控制信息。在该上下文中,“控制”信息意味着命令、控制信号以 及地址,但不包括数据。注意,被每个接收HEMi从主机接收的控制信息可以与由接收HEMi 传递的控制信息不同。每个传送HEMi从其它SSD控制器元件接收控制信息,并通过物理接口 1701向一 个主机传递控制信息。再次,由传送HEMi向主机传送的控制信息可以与由传送HEMi接收 的控制信息不同。每个接收级缓冲器通过物理接口 1701从一个主机接收数据,并且向数据路径 DRAM 107传送该数据。接收级缓冲器是16K字节,其允许它们接收最多4个FC_AL( “光纤 信道仲裁环”)数据帧。每个传送级缓冲器从数据路径DRAM 107接收数据,并且通过物理接口 1701将该 数据传送到一个主机上。传送级缓冲器是4K字节,其允许它们存储一个流出帧与一个来自 数据路径DRAM 107的流入帧。图18示出有关主机端口 0 104的某些额外细节。如本领域的普通技术人员所理 解的,根据主机所使用的特定协议的规定组织SSD控制器106与主机101之间的通信。一 般地,相关协议(例如,SAS、SATA、光纤信道)指定向和从主机的通信使用帧发生,所述帧包 括命令和数据的定义组。因为在各种相关的协议之中使用的精确的帧格式不同,所以必须为每个协议修改 SSD控制器106。然而,SSD控制器106已经被设计为使得所述修改很小,总共(amount to) 是用于接收和传送HEMi的不同固件、以及不同的物理连接器。SSD控制器106的所有其它 方面对于各种协议来说不变。这是SSD控制器106的流水线化和模块化设计、以及主机接 口 310的设计的重大优点。虽然帧组织的具体细节随着协议的不同而不同,但SATA协议的某些方面将被用于阐述主机端口 0 104的设计和操作。在该协议中,帧包括帧开始(“S0F”)基元、帧头 (由协议指定的元数据、但一般包括识别有效载荷与可能的启动器所必需的信息)、有效载 荷(例如,数据、命令等)、用于整个帧的验证的CRC值、以及帧结束(“EOF”)基元。主机端 0 104的接收侧负责接收帧,将其分为它的构成部分,以及执行将数据路由到它预期的目的 地和/或建立事务所需要的任何动作。主机端口的传送侧负责从SSD控制器106的其它元 件接收相关数据和命令信息,并且将该信息包装到帧中用于向主机101传送。由GigaBlaze 1801处理与主机的直接通信,其是可从LSI公司获得的、型号为 0. 11微米的GigaBlaze Gflx xl Core的收发器核,LSI公司总部在加州的米尔皮塔斯。 该核包含8b/10b编码器、串行器/解串行器以及phy,其执行所接收的比特与电压电平之 间的物理转换。GigaBlaze 1801具有两个能够附接到3G SATA、3G SAS、4g FC_AL与4G FC 总线的串行端口。除了其处理到主机的物理接口外,这里不涉及GigaBlaze 1801内部操 作的细节。在所示的实施例中,GigaBlaze 1801连接到主机101。注意,虽然图18仅示出 了 SSD控制器106上的两个主机端口之一,但另一主机端口完全相同,并且包含它自己的 GigaBlaze0如图18 所示,GigaBlaze 1801 连接到基元匹配逻辑 1802 (Primitive Match Logic)。基元匹配逻辑被设计来允许相同的物理层协议与不同地处理帧和基元的各种不同 的逻辑层协议进行接口。当GigaBlaze 1801从主机101接收基元时,GigaBlaze 1801将 该基元路由到基元匹配逻辑,下文联系图19详细描述基元匹配逻辑。基元匹配逻辑控制帧路由器1803,帧路由器1803从GigaBlaze 1801接收帧,并在 基元匹配逻辑的控制下路由这些帧的部分。数据被路由到接收级缓冲器0 1706,头部被路 由到非数据有效载荷FIFO 1804,以及基元被路由到进站(Inbound)基元FIFO 1808。接收HEMi 0 1702使用头部和基元FIFO中的信息来识别要执行的动作。路由到 接收级缓冲器的数据经由DMA传输被发送到数据路径DRAM 107。接收HEMi 1702产生基元,并将它们路由到出站(outbound)基元FIF01805。这些 产生的基元包括ACK(确认帧的正确接收)、NAK(指示未正确接收到帧)、以及RRDY(向启 动器报告帧信用(credit))。出站基元FIFO 1805上的基元被立即插入到向主机101的传 送,并且可以被插在其它事务(例如,出站数据帧)中间。图18中所示的主机端口的传送侧由传送HEMi 1704、传送级缓冲器01708与传送 帧缓冲器1806构成。传送级缓冲器0 1708包含从数据路径DRAM107接收的数据,其要被 传送到主机101作为响应于读命令的帧的一部分。传送帧缓冲器1806包括一个或多个保 持用于构建帧的元数据的缓冲器。传送帧缓冲器与接收侧缓冲器类似地操作,然而,应该理 解,它们被用于构建帧而不是解构帧。直通(Cut-Through)逻辑1807帮助将SSD控制器106接口到光纤信道网路。如 果SSD控制器106连接到光纤信道网络,则基元匹配逻辑1802评估接收的基元,来确定这 些基元是否意在用于SSD控制器106。确定不意在用于SSD控制器的基元被发送到直通逻 辑1807。直通逻辑接着将这些基元传递到GigaBlaze,以返回到光纤信道网络,用于传送到 网络中的下一个节点。各种不同协议(SAS、SATA与光纤信道)所需要的物理连接器不兼容。在当前的优 选实施例中,SSD控制器106的不同版本将为每个协议存在。然而,因为基元匹配逻辑利用
25这些协议中的每个都正确地操作(见下),所以对于每个协议所需要的仅有的不同是使用 不同的物理连接器,然而,对于接收和传送HEMi来说也可能需要不同的固件。在不同的实 施例中,SSD控制器106可以合并三个不同的物理连接器,每个协议一个,并因此允许利用 任何协议使用相同的物理控制器。图19中更详细地示出了基元匹配逻辑1802。该逻辑包括状态机,其匹配接收的基 元,并基于所匹配的基元与当前状态识别要执行的动作。从Gigablaze 1801向基元锁存器(Primitive Latch) 1901传送从主机接收的基 元。接着,针对包含在基元匹配寄存器1902中的位模式(bit pattern)来匹配基元,基元 匹配寄存器1902包括十六个寄存器。如果未发现匹配,则来自基元锁存器1901的值被直 接路由到进站基元FIFO 1808上。基元匹配控制寄存器1903包括十六个寄存器,每个基元匹配寄存器一个。基元匹 配控制寄存器包含指示为了发现全面匹配,所关联的基元匹配寄存器中的哪些位必须与基 元锁存器1901中的值匹配的位。例如,这些位可能需要第一个字节匹配,而不需要任何其 它位匹配。因此,来自基元匹配控制寄存器的这些位担当掩码(mask),允许多个接收的基元 匹配单个基元匹配寄存器。这在要为一类接收的基元执行相同的动作的情况中有用,也在 筛选表示除了命令之外的数据的部分基元时有用。如果基元匹配寄存器1902的相应寄存器中的值匹配基元锁存寄存器1901,则基 元匹配控制寄存器1903中的其它位指示要执行的动作。例如,这些位可以控制帧路由器 1803,以便跟随基元的某些数据移动到非数据有效载荷FIFO 1804中,并且,跟随该数据的 数据被移动到接收级缓冲器1706中。通常,这会发生在连同数据帧一起接收SOF基元的情 况下。基元匹配控制寄存器作为状态机操作。例如,某些位可以设置可以引起一定数目 的后续基元被当前控制寄存器而不是通过基元匹配寄存器选择的控制寄存器操作的计数 器(未示出)。此外,基元匹配控制寄存器可以改变包含在各种其它未示出的寄存器中的值。应该理解,基元匹配逻辑1802包含这样的逻辑执行基元锁存器1901与基元匹配 寄存器1902之间的比较,以及实施基元匹配控制寄存器1903所需要的控制功能。如下文联系图28所解释,使用数据覆盖(overlay),通过关联的接收HEMi加载基 元匹配寄存器1902与基元匹配控制寄存器1903。因为每个协议具有其自身的基元集,所 以,这些覆盖被用于对不同协议(例如,SAS、SATA)定制(customize)基元匹配逻辑1802。 此外,覆盖可以被用于在单个协议内处理不同的基元集、或不同的状态。从初始化固件代码 载入(firmware code load)中获取被接收HEMi用于加载基元匹配和基元匹配控制寄存器 的值。因此,在许多情况下,可以为新协议或通过对接收HEMi固件的修改而对现有协议的 修改,来更新基元匹配逻辑1802,而对硬件没有任何改变。因此,基元匹配逻辑中不同覆盖的使用允许SSD控制器106响应于不同的协议,而 不需要用于每个协议的个别化逻辑。基元匹配逻辑1802还包含帧破解逻辑(Frame Cracking Logic) 1904。该逻辑块 接收帧中的初始双字,并评估该双字来确定帧的性质(例如,数据、命令)。基于帧的类型, 帧破解逻辑将该帧合适地路由。例如,如果该帧是命令帧,则帧破解逻辑向非数据有效载荷
26FIFO 1804路由整个帧,而如果该帧是数据帧,则帧破解逻辑向非数据有效载荷FIFO路由 头部部分,并且向合适的接收级缓冲器路由数据部分。如上所述,基元匹配逻辑的有利之处在于在不需要软件或重大的硬件改变的情 况下,其允许SSD控制器106处理不同的协议,所述不同的协议涉及不同的帧编码。此外, 在元数据和命令信息被路由到不同的FIFO(例如,非数据有效载荷FIFO 1804以及进站基 元FIFO 1808)的同时,通过向包含在接收级缓冲器中的专门的数据FIFO路由数据,接收主 机端口设计允许更有效率的数据传输,这是因为,数据FIFO仅包含数据而不包含命令或元 数据,并允许与头部和基元元数据上的接收HEMi操作并行地,经由DMA传输将数据传输到 数据路径DRAM,由此提高整个系统性能。如上所述,SSD控制器106可以被用于多种不同的协议,仅需要对HEMi固件的修 改与不同的物理连接器。所有上述协议都相对类似。还可以容易地使SSD控制器106适 用于与上述协议具有重大区别的协议。例如,在一个实施例中,SSD控制器106可以适用于 面向通道(lane-oriented)的协议,如PCI Express。如本领域的技术人员所理解,在PCI Express系统中,外部设备使用“通道”传送和接收数据和元数据,每个通道利用横跨这些通 道被分条的双字数据来携带传送的一部分。通道的数量是实施相关的,但SSD控制器可以 通过增加两个额外的GigaBlaze (应该理解,每个GigaBlaze将是为PCI Express接口设计 的版本)、两个额外的接收HEMi和两个额外的传送HEMi而适用于4通道PCI EXPRESS系 统。一个GigaBlaze、一个接收HEMi和一个传送HEMi专用于每个通道。在该实施例中,未 使用SCSI HEMi 2001 (见下)。该HEMi可以被替代地用作额外的RdWr HEMi。在该实施例中,在外部主机上操作的设备驱动器负责将PCI EXPRESS传送格式化 为Ι0Ρ。因此,大多数主机端口逻辑是不必要的(例如,基元匹配、各种FIFO等)。接收和 传送HEMi分别负责对数据取消分条(destriping)和重新分条(restriping)。一旦所接收 的IOP已被取消分条,则其随后可以被直接传递到RdWr HEMi (见下)。然后,处理根据如上 面描述的其它协议进行。虽然带有面向通道的协议(诸如PCI EXPRESS)的SSD控制器106的使用需要某些 额外的修改,但这些修改相对较小,并且,由于控制器的模块化设计,所述修改容易被接纳。 HEMi的增加和减少相对简单,并且因为控制器流水线的不同级独立操作,所以,一个级(例 如主机端口)处的改变不需要其它级(例如,闪存端口)处的改变。可以简单地设计SSD控制器106,以用于iSCSI协议,尽管这需要向主机端口增加 一个或多个TCP/IP栈,同时,接收HEMi负责从所述栈中提取⑶B,并且传送HEMi负责编码 TCP/IP协议所需要的帧信息。B.命令解析器图20示出了关于来自图3的命令解析器块311的额外的细节。如联系图3所描 述,命令解析器块311与主机接口 310和命令分布块312通信。命令解析器块311 包括 SCSI HEMi 2001。SCSI HEMi 2001 从接收 HEMi 1702 和 1703接收主机命令。SCSI HEMi 2001确定主机命令是读/写、还是某个其它类型的命令。 如果命令不是读/写命令,则SCSI HEMi 2001将该命令交给ARM处理器2002,其处理非读 /写命令。下文进一步描述ARM处理器2002。如果SCSI HEMi 2001确定命令是读/写命令,则其验证该命令,以确保一致性,这意味着如果读或写命令涉及与当前正被命令分布块312处理的读或写命令相同的数据, 则第二个命令被延迟直到完成了第一个命令的特定处理。SCSI协议不需要读/写一致性,该SCSI协议允许对读和写重新排序。然而,如下 文所描述,SSD控制器106将主机发起的命令分解为多个子操作,并且,可以不按顺序处理 这些子操作。如果SSD控制器106要允许多于一个命令同时在相同的数据上操作,则可能在第 一个命令已完成之前执行第二个命令的部分。例如,如果SSD控制器106要接收到对特定 LBA块的写命令,并且接着要接收到对重叠的LBA块的读命令,并且如果允许读命令在写命 令已结束之前开始操作,则可能读命令导致返回某些已经被写命令更新了的数据、以及某 些还未被更新的数据。为此原因,SSD控制器106在如下两个位置上跟踪当前有效的命令在SCSI HEMi 2001中、以及在闪存HEMi (下文描述)中。存储在被称为其mRAM(联系图26,见下文)的HEMi的内部存储器中的SCSI HEMi 命令表2003包含每个主机读和写命令的LBA和传输长度,该读和写命令已经被SCSI HEMi 2001向命令分布块312发送,但还没有被发送到闪存HEMi上。如下文所述,命令分布块包含几个被称为RdWr HEMi的HEMi。命令表2003包含处 理每个命令的RdWr HEMi的标识符。SCSI HEMi 2001使用该信息在RdWr HEMi之间平衡工 作负荷,向带有相对较少的当前有效命令的RdWr HEMi发送新命令。当接收到新命令时,SCSI HEMi 2001检查命令表2003,以确定被该命令影响的 LBA地址是否已经存在。如果发现匹配,则SCSI HEMi 2001停止(stall)新命令的执行直 到前一命令从表中被移除。一旦被分派了命令的RdWr HEMi报告其已经创建和分派了对应 于该命令的所有传输请求(下文描述RdWr HEMi分派这种传输请求的处理),就从命令表 2003中移除该命令。此时,新命令不再被停止。应该理解,此时,较早的命令仍然在执行,但 现在在闪存HEMi层对该命令进行一致性检查(下文描述)。因此,SSD控制器106在主机命令的流水线执行中的两点上增强了读/写一致性 SCSI HEMi 2001停止与现有命令的LBA范围冲突的新命令,直到现有命令已被发送到闪存 HEMi为止,以及每个闪存HEMi在其自身的操作上增强一致性,从而,其停止覆盖与现有命 令相同的范围的新命令的执行,直到现有命令完成。一致性增强的所述两级系统是有利的,这是因为,只要冲突的命令在流水线的不 同级上,则允许继续它们的处理。因此,RdWr HEMi可以在与第一冲突命令在闪存中操作的 同时设立第二冲突命令,由此提高整个系统性能。如上所述,命令解析器块311还包含ARM处理器2002,其控制某些内部管理操作, 并负责处理除了读或写之外的主机发起的命令。在当前的优选实施例中,ARM处理器2002 是ARM7TDMi-s,其可以从英国剑桥的ARM持股公司获得。然而,应该理解,ARM处理器2002 的功能可以由多种逻辑器件处理。虽然由ARM处理器2002处理的主机命令的准确性质是协议相关的,但在一个实施 例中,这些命令包括测试单元准备(TestUnit Ready)读容量(Read Capacity)
28
模式选择(ModeSelect)模式感测(Mode Sense)逻辑选择(LogSelect)逻辑探测(LogSense)才艮告 Luns (Report Luns)发送诊断(SendDiagnostic)请求探测(Request Sense)写缓冲(WriteBuffer)读缓冲(ReadBuffer)C.命令分布图21详细图示了命令分布块312。如所示,命令分布块312构成一组RdWr HEMi, 标记为2101-2106。在当前的优选实施例中,命令分布块312包括六个RdWr HEMi0然而, 因为SSD控制器106的模块化设计,所以RdWr HEMi的数量可以被增加或减少,而不需要控 制器的其余部分的重大重新设计。更大数量的RdWr HEMi提高性能,但具有昂贵且更复杂 的代价。如图21所示,SCSI HEMi 2001向每个RdWr HEMi传递信息。一般地,所述信息包括 CDBinfo,基于该HEMi相对于其它RdWr HEMi的相对工作负荷,SCSI HEMi 2001将CDBinfo 分配给特定RdWr HEMi。Rdffr HEMi基于⑶Binfo产生Ι0Ρ,接着产生如IOP所需要的传输请求,并基于要 传输的数据的闪存地址将这些传输请求传送到特定闪存端口。RdWr HEMI还与传送HEMi通 信;在主机写的情况中,负责的RdWr HEMi向传送HEMi发送通信,指示该传送HEMi应该向 主机通知控制器对于与写关联的数据准备好。D.交叉(Crossbar);共享 RAM ;DRAM前述图已经图示了功能块之间在数据和控制流方面的相互联系,并且没有试图示 出物理细节。图22图示了当前实施例中SSD控制器106的许多功能块物理互联的方式。图22示出了交叉切换器2201。如本领域的普通技术人员所共同理解的,交叉切换 器操作,以便将切换器一侧上的任意元件与切换器另一侧上的任意元件连接。以下文将解 释的方式,交叉切换器2201将其HEMi侧上的元件与其共享RAM侧上的元件连接。交叉切换器2201的HEMi侧具有向包含在SSD控制器106中的每个HEMi的双路 连接(图22中所示的HEMi实际上是HEMi和与每个HEMi关联的紧密耦接的逻辑的组合, 这里的其它地方将进一步描述该逻辑)。如这里其它地方所述,HEMi的数量可以根据实施决定而不同(例如,控制器可以 包括八和十二之间的闪存HEMi)。在当前的实施例中,交叉切换器2201的共享RAM侧连接到十个RAM子组,标记为 共享RAM子组0 (2202)至共享RAM子组7、全局寄存器2203以及PIO缓冲器2204,并且共 同标记为共享RAM块318。在当前的优选实施例中,每个共享RAM子组包括4K字节的RAM 存储空间。交叉切换器2201被设计来连接到更多数量的共享RAM子组,因此支持模块扩展 性,如下文所解释。虽然所有十个共享RAM子组共享地址空间,但如上文所解释,这些子组中的某些
29具有专门的功能。如图22所示,交叉切换器2201对于每个共享RAM子组包括一个端口。每个共享 RAM子组包括四个FIFO和数据结构段(section),并且,由关联的FIFO寄存器块控制每个 FIFO (例如,寄存器块2205控制FIFO 0,块2206控制FIFO 1,等)。如连接共享RAM端口 0与共享RAM子组0的箭头所示,共享的RAM端口 0仅是向 共享RAM子组0的FIFO 0-3或数据结构段的输入或输出路径,该路径通过关联的寄存器去 往和来自这些FIFO。如下文所解释,对FIFO的读或写通过关联的寄存器块发生,而对数据 结构段的读或写在不通过关联的寄存器的情况下访问该段。在当前的优选实施例中,实际上仅使用这些FIFO中的27个(23个用于HEMi工作 列表,四个用于空闲列表)。其余五个可用于扩展系统所支持的HEMi的数量。交叉切换器2201的全局寄存器端口 2207连接到全局寄存器2203,其包括由执行 多种功能的寄存器构成的RAM子组,所述功能包括控制GigaBlazelSOl与设立DRAM控制器 2305 (下文联系图23描述)。交叉切换器DRAM端口 2208连接到PIO ( “编程的10”) DRAM缓冲器2204,其接着 连接到数据路径DRAM 107。PIO DRAM缓冲器2204是包含在共享RAM的子组中的64个双 字的FIFO,其被用于缓冲HEMi与数据路径DRAM之间的通信。因为数据路径DRAM以更高的 时钟速度运行并且能够同时读或写四个双字,而HEMi仅能够同时读和写单个双字,所以需 要这种缓冲。为了避免减慢数据路径DRAM的操作,PIO DRAM缓冲器2204缓冲向和从DRAM 的数据传输。当HEMi正向数据路径DRAM写入数据时,PI0DRAM缓冲器2204存储该数据, 一次一个双字,直到该写入完成或缓冲器满了为止,此时,其将数据突发发送(burst)给数 据路径DRAM。当HEMi正从数据路径DRAM读取数据时,PIO DRAM缓冲器2204每次存储来 自数据路径DRAM的数据的四个双字,并且,一旦所有必需的数据都可用(或者PIO缓冲器 满了)JljHEMi以突发方式读取数据,一次一个双字。再次,应该理解,实际上,在DRAM与大 量缓冲器中的一个之间传输数据。注意,从交叉切换器2201到PIO缓冲器2204的连接不被用于数据路径DRAM与闪 存端口级缓冲器之间、或者主机接口传送与接收级缓冲器之间的数据传输,而替代地,其仅 用于与HEMi的通信。向和从各种级缓冲器的传输不通过交叉切换器2201。交叉切换器调试端口 2209连接到调试FIFO 2210。调试FIFO 2210是担当用于调 试来自HEMi的信息的FIFO的大SRAM子组。调试FIFO 2210接受来自HEMi的信息,每次 一个双字,并且将该信息存入4个双字宽的FIFO结构中。一旦调试FIFO 2210达到设置的 容量阈值,则其仲裁(arbitrate)访问DRAM端口,并且,一旦其已获得了这样的访问,其将 调试信息突发地写入DRAM 107中,一次4个双字。如交叉切换器所惯例的,交叉切换器2201可以同时将来自HEMi侧的多个元件与 共享RAM侧的多个元件连接,其仅由每侧的端口数量限制。交叉切换器2201能够将每个HEMi连接到每个共享的RAM子组、以及切换器的共 享RAM侧上的其它资源。然而,应该理解,切换器不将HEMi彼此直接连接,也不将共享RAM 子组彼此直接连接。通过使用交叉切换器2201将信息留在共享RAM子组中,间接地完成 HEMi之间的通信。因此,当(如下所述),作为所接收的⑶B的结果,SCSI HEMi 2001产生Ι0Ρ,并且,将该IOP传递到RdWr HEMi,这被通过SCSI HEMi 2001将指向IOP位置的指针存储在用于 Rdffr HEMi的工作列表中而处理,所述工作列表还可以被存储在共享RAM子组的一个FIFO 中。然后,Rdffr HEMi通过检查工作列表、识别包含IOP的位置、以及从所述位置将IOP复 制到它自身的内部存储器中,接收Ι0Ρ。在其它HEMi之间的通信以类似的方式进行。下文 描述包含在共享RAM子组中的数据结构的细节、以及HEMi使用这些数据结构传输信息的方 式。DRAM访问寄存器块2211控制对数据路径DRAM 107的访问。如上文所解释,HEMi 不直接访问数据路径DRAM 107,而是替代地,使用PIO缓冲器2204用于此目的。这些是DMA 传输,其需要HEMi仅提供起始地址和传输的大小。地址寄存器2212在用于该传输的数据路径DRAM中存储起始位置。传输计数 (count)寄存器2213存储所需要传输的数量。数据寄存器2214存储要被发送到PIO缓冲 器2204或从PIO缓冲器接收的数据。从数据路径DRAM 107的读以HEMi在寄存器2212中放置DRAM地址以及将传输的 大小(以四个双字的形式)放入传输计数寄存器2213中开始。这些动作引起DRAM DMA引 擎2302 (见下文)以四个双字组块的形式将数据传输到PIO缓冲器2204中。当每个传输 发生时,DRAM DMA引擎递减传输计数寄存器2213,并且,当传输计数寄存器2213达到0时, DMA传输结束。在DMA传输完成之后,以双字的增量,自动从PIO缓冲器向数据寄存器2214读取 数据。从HEMi向数据路径DRAM 107的写类似地操作。注意,每次传输计数寄存器2213递减时,地址寄存器2212递增。这对于当前发生 的传输来说不必要,这是因为,DRAM DMA引擎仅需要初始地址加上传输计数。然而,递增地 址寄存器2212导致一旦传输完成,用于传输的结束地址被保持在所述寄存器中,而且这可 以在设定未来的传输中有用。在图23中图示RAM控制器317。一般地,RAM控制器控制和仲裁对共享RAM块318 和数据路径DRAM 107的访问。RAM控制器317包括以下逻辑块(应该理解,并且如这里其它硬件图也是正确的, 图23中的图示本质上是概念性的并且不意在传达实际物理布局的细节)共享RAM控制器1201。交叉切换器2201。DRAM控制器2305,包括从加利福尼亚州帕洛阿尔托的Denali软件公司购买的逻 辑,其管理进入数据路径DRAM 107的物理接口。DRAM控制器2305包括DRAM DMA引擎2302。DMA引擎2302处理数据路径DRAM 107和与DRAM通信的各种缓冲器(例如,接收缓冲器1706、传送缓冲器1708、闪存级缓冲器 308、PI0缓冲器2204、调试FIFO 2210)之间的DMA传输。DMA引擎2303从HEMi接收起始 地址和DMA传输的传输计数,并且控制从那里的传输,而不需要来自HEMi的附加信息。E2E逻辑2303执行三种涉及E2E标签的任务,上文联系图13描述了 E2E标签(a) 将E2E标签附接到正被发送到闪存的数据的每个区段;(b)相对期望值检查标签值,并且, 如果所述值不匹配,产生错误情形;以及(c)如果启动器未使用这些值(并因此不期望它
31们),则从正被传送到主机的数据中剥离E2E标签。附接到数据的每个区段的E2E标签是参考标签1304、应用标签1305以及CRC 1306。如上文所解释,对于从支持E2E的启动器接收的数据,从自启动器接收的信息中获取 这些值,或基于从启动器接收的信息计算这些值,而对于从不支持E2E的启动器接收的数 据,这些值被内部产生。E2E逻辑2303能够检查参考标签、应用标签或CRC值。上文联系图13描述了这些 检查。只要当在数据路径DRAM 107与闪存级缓冲器之间传输数据或在数据路径DRAM 107 与接收缓冲器或传送缓冲器之间传输数据时,E2E逻辑2303便执行这些检查。除非启动器 不支持E2E,否则启动器指定要检查这些字段中的哪些。如果启动器不支持E2E,则基于由 用户在初始化时选择的参数执行检查。注意,为了内部错误检查的目的,始终检查参考标签 值,即使启动器不支持E2E且用户不要求进行该检查的情况下也是如此。E2E逻辑2303将E2E标签附接到从数据路径DRAM 107向闪存级缓冲器传递的数 据的每个区段。如上文联系图13所解释,如果启动器支持E2E,则从由启动器提供的信息中 获取参考标签信息。启动器可能需要为每个数据区段递增参考标签,其中,E2E逻辑2303在 附接参考标签前执行递增操作。如果启动器不支持E2E,则E2E逻辑2303将LBA插入参考 标签字段1304中。如果启动器支持E2E,则应用标签和CRC字段被填入由启动器提供的信 息。如果启动器不支持E2E,则应用标签被填入缺省值,并且,根据用户在初始化时的选择, CRC字段被填入缺省值或内部计算的CRC值之一。DRAM调度器2304包括可以访问数据路径DRAM 107的每个信道的排序列表。下文 联系图25描述这些信道。因为DRAM仅具有单个输入/输出端口,所以同时仅一个信道可 以访问DRAM端口。DRAM调度器2304轮换(rotate)经过每个信道,检查该信道是否需要访 问DRAM,如果需要,则允许该信道连接到DRAM端口。一旦所述访问完成,DRAM调度器2304 移动到列表中的下一信道。以该方法,DRAM调度器2304以循环的方式仲裁对DRAM端口的 访问ο图24示出共享RAM控制器2301、以及包含在共享RAM控制器2301中的寄存器块 和包含在共享RAM中的FIFO之间的关系的某些方面。特别地,图24示出FIFO指针寄存器 2205、2206、2401和2402,其与包含在共享RAM子组0 2202中的FIFO 0_3相关。共享RAM 控制器2301每个共享RAM子组包含4个指针寄存器块,总共32个,不过它们中的某些可能 未被使用。注意,为了清楚的目的,未示出控制除子组0之外的共享RAM子组的共享RAM控 制器2301的部分。如图23所示,FIFO 0指针寄存器2205与包含在共享RAM子组0 2202中的 FIFO(2403)关联。指针寄存器2205包括以下寄存器基址(base)寄存器2404包含指向共享RAM子组2202内的地址位置的指针,所 述地址位置构成共享RAM子组2202中的专用于FIFO 2403的部分的一个边界。上限地址 (ceiling)寄存器2405包含指向共享RAM子组0内的地址位置的指针,所述地址位置构成 共享RAM子组2202中的专用于FIFO 2403的部分的另一边界。这些寄存器定义FIFO 0的 位置和大小。在当前的优选实施例中,在初始化时设置它们,并且在操作期间中不改变。在 替代实施例中,可以动态地重新设置这些值,由此允许在共享RAM子组2202内更有效率的 空间分配,但具有增加的复杂性的代价。
FIFO 2403是先进先出存储器结构。如此,其具有顶部(top),表示最近插入的条 目(entry);以及底部(bottom),表示最旧的条目。FIFO 2403是回卷的(wraps around), 并且当前顶部和当前底部的位置将在使用期间改变。顶部寄存器2406包含指向共享RAM子组2202内的构成FIFO 2403的当前顶部的 地址位置的指针。底部寄存器2407包含指向共享RAM子组2202内的构成FIFO 2403的当 前底部的地址位置的指针。计数寄存器2408包含表示FIFO 2403中当前有效的元件的数目的值。可以通过 比较顶部寄存器2406与底部寄存器2407来获取相同的信息,但是,由于不需要计算就使该 信息可用,所以得到性能优势。只要有数据项(item)加入FIFO 2403时,就自动递增计数 寄存器2408,并且,只要数据项被移除时,就自动递减计数寄存器2408。如图24所示,尽管未示出下述各个寄存器,但共享RAM控制器2301还包含对应于 FIFO 1-3 的 FIFO 指针寄存器 2206,2401 和 2402。共享RAM子组0还包含数据结构2409。如联系图41所解释的,在共享RAM中存储 了多种非FIFO数据结构,包括启动器表、⑶Binfo表、IOP表、传输请求表、以及全局变量。注意,每个空闲列表与其关联的表必须被存储在相同的共享RAM子组上(见下文, 联系图41)。共享RAM控制器2301还包含交叉仲裁逻辑2410。如上所述,交叉切换器2201对于 每个HEMi具有一个端口,并且将这些端口与八个共享RAM端口(每个共享RAM子组一个)、 全局寄存器、调试FIFO r以及数据路径DRAM连接。这需要一些手段来在这些HEMi (在当 前实施例中的23个)之间仲裁访问共享的RAM和DRAM端口。由交叉仲裁逻辑2410处理该仲裁。该逻辑使用公平的仲裁算法,以在多于一个 HEMi需要访问相同端口的情况下在这些HEMi之间仲裁。在当前的优选实施例中,该仲裁以 循环的方式进行,从最近获得对该端口的访问的HEMi开始,通过所述HEMi向上计数直到到 达期望访问的第一个HEMi为止,从最大编号的HEMi (在当前实施例中的HEMi 22)回卷到 HEMi 0。因此,如果HEMi 5和10需要访问特定共享RAM端口,并且最近访问该端口的HEMi 是HEMi 15,则将准许HEMi 5访问,这是因为,交叉仲裁逻辑2410将从15起向上计数,在 22后回卷,并且HEMi 5将是需要访问该端口之中的其第一个到达的HEMi。应该理解,可以 使用多种其它的仲裁算法。交叉仲裁逻辑2410还包含这样的机制在已经获得对端口的访问的HEMi的请求 时,在端口上放置保留(hold)。这允许HEMi完成不应被中断的事务。注意,图24中所示的设计允许模块的可扩展性,这是因为每次加入单个闪存端口 可以提高系统的容量。这么做需要加入闪存端口、闪存、以及闪存HEMi,并为每四个被加入 的HEMi加入一个共享RAM(以保持HEMi工作列表(见下文)),再对于每个共享RAM加上四 组FIFO指针寄存器。加入共享RAM还添加了可以被分配到附加⑶Binfo、IOP以及传输请 求的空间。此外,向交叉切换器2201加入新共享RAM端口相对容易。该类型的扩展需要共享RAM子组的布局的很小的重新设计,从而将数据跨越新加 入的子组分散,但可以通过修改用于初始化共享RAM子组的数据来处理它。不需要对HEMi 或HEMi固件的改变。该模块化设计允许从包含两到三个闪存端口的简单系统向包含至多23个闪存端口的大得多的系统扩展,而不需要任何软件或主要的硬件改变。因此,可以将相同的结构用 于仅包括两到三个HEMi的便宜的工作站设计,或大得多的系统。共享RAM控制器2301还包括共享RAM访问寄存器块2411,其被HEMi用于访问共 享RAM块318。块2411包括以下寄存器共享RAM地址寄存器2412包含双字形式的共享RAM中的地址,该双字是访问的对 象。该地址的高位指示要选择的特定共享RAM子组,低位指示该子组中的位置。共享RAM数据自动递增(Autoinc)寄存器2413保持从存储在地址寄存器中的地 址读取或要向其写入的双字数据。共享RAM数据自动递增寄存器的使用导致地址寄存器 2412中的值自动递增。在读时,一旦数据被复制进寄存器2413,地址寄存器2412就递增。 在写时,一旦从寄存器2413向外写数据,地址寄存器2412就递减。与重复计数(Itepeat Count)寄存器2702 (见下文,联系图27) —起使用该自动递 增寄存器,用于数据的DMA型块传输。所需的传输次数被写入重复计数寄存器2702,并且初 始地址被写入地址寄存器2412。然后,数据自动递增寄存器2413随后将重复读或写在重复 计数寄存器中指示的重复次数,其中每次重复导致地址寄存器2412递增,从而下一访问针 对共享RAM中的下一双字。共享RAM数据寄存器2414执行与数据自动递增寄存器相同的功能,但不引起地址 寄存器2412递增。寄存器2414被用于对相同存储位置的多次访问,例如,读取变量然后修 改它。映射号(Mapnum)寄存器2415被用于选择共享RAM块318中的一个FIFO。顶部(top)寄存器2416、添附(Append)寄存器2417、推入(Push)寄存器2418、 以及弹出(Pop)寄存器2419各自保持双字数据。这些寄存器被用于对由数据映射寄存器 2415选择的FIFO的四个不同类型的访问。HEMi可以从FIFO的顶部读值而不修改FIFO中 的顶部值的位置,或者,其可以使顶部值从FIFO中“弹出”,由此引起FIFO顶部指向FIFO中 的下一值。这些操作导致返回值被分别写入顶部寄存器2416或弹出寄存器2419中。HEMi还可以将值“推入”到FIFO的顶部,从而该新值变成FIFO的新顶部,或者将 值添加到FIFO的底部。对于这些操作,由HEMi将要被写入的数据分别放置到推入寄存器 2418或添附寄存器2417中。在FIFO的顶部或底部放置信息的能力提供了额外的灵活性。例如,这允许将更重 要的任务放置在工作列表的顶部,而将较不重要的任务放置在底部。图25图示了向和从数据路径DRAM 107的输入和输出路径。在当前的实施例中, SSD控制器106可以包括需要访问DRAM的18个资源(取决于结构)至多12个闪存级缓 冲器(示出为FSB 0 308,FSB 1 314以及FSB 11 2501,为了清楚的目的,未示出1和11之 间的闪存级缓冲器;如上所解释,SSD控制器106的特定实施可以具有少于12个闪存端口, 并因此具有少于12个闪存级缓冲器)、PIO缓冲器2204、调试FIFO 2210、接收级缓冲器0 1706、传送级缓冲器0 1708、接收级缓冲器1 1707以及传送级缓冲器1 1709。这些资源与数据路径DRAM之间的路径在这里被称为“信道”。应该理解,虽然每个 资源都有必要通过物理传送路径连接到DRAM,但信道本质上是概念性的,且其不一定反映 实际的总线结构。在当前的实施例中,数据路径DRAM 107具有标记为DRAM端口 2502的单个输入/输出端口,然而,用于此目的的其它存储器可以具有更多数量的端口。如上所解释,DRAM调 度器2304在这些信道之间以循环方式仲裁向需要访问DRAM端口 2502的信道分配访问。在 替代实施例中,可以使用其它仲裁方案。例如,可以根据被传输的数据类型将访问按优先级 排序,或者可以让寻求访问DRAM的资源(例如,调试FIFO 2210)的优先级低于闪存级缓冲 器访问。图25图示了信道与DRAM端口 2502之间通过切换器2503的连接。通过在DRAM调 度器2304的控制下操作,切换器2503每次将一个信道连接到DRAM端口 2502。图25中所 示的箭头图示了所允许的连接的方向性,例如,闪存级缓冲器308可以从DRAM读、或向DRAM 写,调试FIFO 2210可以向DRAM中写,但不可以从DRAM读,而传送缓冲器1708可以从DRAM 读,但不能向DRAM写。切换器2503本质上是概念性的,且不一定表示单个大切换器。相反,此功能性 (functionality)可以包括大量部署在不同位置的逻辑门。该功能性的准确物理设计是实 施特定的。当信道获得对DRAM端口 2502的访问时,数据在该信道与DRAM之间的移动以突发 包的方式发生,其由各自包括四个双字的传输构成。该突发包继续,直到读或写完成,或者 直到连接到该信道的资源满了(对于来自DRAM的传输)或空了(对于向DRAM的传输)为 止。一旦突发包被中止,该信道便失去其通过切换器2503的访问,并且,DRAM调度器2304 将访问赋予需要该访问的下一个信道。E. HEMi如上所述,SSD控制器106包含在这里称为HEMi的大量处理器。如这里所使用的, 词汇“处理器”或“微处理器”指代包括能够执行至少基本算数和/或逻辑操作的ALU、处理 器专用的保持数据的存储器、以及控制ALU的操作的控制逻辑(所述控制逻辑包括硬件、软 件和/或固件)的任何分立的逻辑块。如这里所使用的,“HEMi”指代在当前优选实施例中 使用的特定处理器,然而,应该理解,内部HEMi设计的大量细节在这里是无关的,并且,为 了清楚而将它们忽略。此外,虽然HEMi设计构成当前的优选处理器实施例,但如本领域的 普通技术人员所理解的,也可以使用许多其它的处理器设计。在当前实施例中,SSD控制器106可以包含至多23个HEMi,标记为如下(注意,在 该实施例中,编号系统包括间隙)HEMi 0 用于主机端口 0的接收HEMi (1702)HEMi 1 用于主机端口 0的传送HEMi (1704)HEMi 2 用于主机端口 1的接收HEMi (1703)HEMi 3 用于主机端口 1的传送HEMi (1705)HEMi 8 SCSI HEMi (2001)HEMi 9-14 =Rdffr HEMi (2101-2106)HEMi 15-26 闪存 HEMi (例如,307、309、313)。图26图示了 HEMi的内部功能的某些方面。在当前的优选实施例中,所有HEMi共 享相同的硬件元件,但其通过使用不同的固件布局、以及通过连接到不同的紧密耦接的元 件而被定制用于不同的功能,下文更详细地描述这两点。每个HEMi包括iRAM 2601,其是能够保持实施1000个56位VLIW指令的固件的指令RAM。这些指令每个都能够读1-2个共享RAM或寄存器位置、执行ALU操作、以及按结果 写回或分支。如下所述,数据路径DRAM 107为每个类型的HEMi存储最多八个不同的固件覆盖, 并且,当基于执行的功能而需要时,将这些覆盖复制到iRAM2601中。这允许每个HEMi实施 比在将固件限制于iRAM的大小的情况下可能的指令多得多的指令。基于16位地址提取(fetch) HEMi指令。该地址的3位选择固件覆盖,并且,13位 构成iRAM 2601中的指令的地址。如果被提取的指令的3个固件覆盖位与当前存储在iRAM 2601中的覆盖不匹配,则触发固件交换。一般地,通过将支持需要执行公共任务的指令的固件集合在一起而避免交换固件 覆盖。例如,单个固件覆盖可以处理读和写所必需的大多数公共操作。其它固件覆盖处理 例如初始化和错误校正处理。每个HEMi还包括2K字节的mRAM 2602,其用作正被HEMi使用的数据的存储空间。如图26所示,每个HEMi包括六级流水线,其由提取级2603、I缓冲器级2604、解 码级2605、读级2606、ALU级2607与写回级2608构成。在当前的优选实施例中,每个这些 级在HEMi内构成逻辑块,然而,在替代实施例中,这些可以表示HEMi状态,与用于产生状态 的下层处理器硬件无关。提取级确定与要执行的指令关联的固件的iRAM地址。然后,将该地址传递到 iRAM,如提取级2603和iRAM 2601之间的箭头所指示。然后,在该地址处的固件被载入缓冲器,如iRAM 2601和I缓冲器级2604之间的
箭头所指示。然后,该固件被转交给解码级2605 (如I缓冲器级2604和解码级2605之间的箭 头所示)。解码级解码指令,并执行跳转和调用。其将跳转和调用传送回提取级2603 (如从 解码级2605到提取级2603的箭头所指示)。在直线指令执行的情况下,解码级2605将参 数传递到读级2606。这些参数包括为所需要的操作检索数据的位置。读级2606读指令所需要的1个或2个存储器或寄存器位置。在读两个位置的情 况中,读级2606重复,如从读级2606的输出向其输入循环回来的箭头所指示。如从外部读 2609到读级2606的箭头所指示,用于该信息的资源包括mRAM 2602与外部存储器或寄存器 (由外部读2609概念性地指示)。信息还可以来自图26中未示出的内部寄存器。读级2606将获得的信息传递到ALU级2607,用于由HEMi的ALU进行的运算。来 自运算的结果被传递到提取级2603 (在条件分支的情况下)或写回级2608。写回级2608将ALU运算的结果写入由指令指定的位置。如从写回级2608向外指 向的箭头所指示,结果可以被写入mRAM 2602或外部资源(由外部写2610概念性地指示)。图27图示了在图26中未示出的HEMi设计的方面,包括用于访问各种存储器范围 的寄存器以及紧密耦接到HEMi的逻辑(紧密耦接的逻辑块2701)。应该理解,HEMi和紧密 耦接的逻辑两者都可以包括寄存器和这里未示出的其它部件。此外,为了阐述的目的,寄存 器组自身已被简化。图27图示了闪存HEMi 307及其紧密耦接的逻辑块2701。如上所述,HEMi的内部 设计是相同的。然而,不同类型的HEMi具有不同的密耦合的逻辑块。块2701专用于闪存 HEMi0下文描述用于其它类型的HEMi的密耦合的逻辑的区别。
36
HEMi 307包括重复计数寄存器2702,其保持用于计算操作应被重复的次数的值。 将值载入重复计数寄存器导致由HEMi执行的下一个操作被重复特定次数,其中每次重复 导致重复计数寄存器中的值递减。在以下各种情况下,可以将值“ 1,,强制赋予重复计数寄存器2702,由此结束循环(a)如果条件分支指令由于重复计数寄存器而正在循环,并且该条件发生,从而执 行该分支,则重复计数寄存器被自动强制为“1”,这具有导致下一指令出现一次的效果。应 该理解,在条件分支的情况中,所述下一指令将是该分支中的第一个指令。(b)当设置与重复计数寄存器关联的标志时,任何将某些FIFO计数寄存器从0递 增到1的动作将值1强制赋予重复计数寄存器。FIFO计数寄存器是与用于HEMi的工作列 表关联的寄存器(例如,联系图24所描述的计数寄存器2408)、以及接收缓冲器计数寄存器 (下文结合图28描述)。当HEMi有任务执行时,该能力被用于强制HEMi离开休眠模式。当HEMi没有工作 执行时,其进入休眠模式,在该模式中,空指令(nop)被重复设定的次数,接着,HEMi唤醒, 检查它的工作列表,并且,如果没有任务出现在工作列表中,则恢复执行空指令。这通过将 设定数载入重复计数寄存器2702中以及接着执行空指令而完成。当HEMi在休眠模式中时,将任务写入HEMi的工作列表(见下文)中导致HEMi唤 醒。这通过来自相关计数寄存器的信号完成,该信号将“1”强制赋予重复计数寄存器2702, 由此导致HEMi唤醒并在执行了下一空指令之后执行合适的动作。使用重复计数寄存器强制重复的空指令允许HEMi进入低功率休眠模式,而不需 要任何专门的休眠模式逻辑。此外,这在HEMi将保持在休眠模式中多长时间方面允许非常 细腻的颗粒度。例如,如果HEMi因为当前没有要完成的工作而进入休眠模式,则将最大值 写入重复计数寄存器。在当前的优选实施例中,该值略高于100万,并引起HEMi保持在休 眠模式中(除非被提前唤醒)约4毫秒。在另一示例中,当HEMi开始乘法或除法运算时,重复计数寄存器可以被用于强制 32个空指令,因为这样的运算花费32个HEMi周期。这允许HEMi进入低功率休眠模式,同 时等待下文描述的乘法或除法的结果,并由可以与HEMi的其余部分的操作独立地操作的 逻辑处理所述乘法或除法。注意,仅在执行空指令的情况下使用上述标志,以使得重复计数被强制为1,因为 在其它情况下可能中断代码循环。为此原因,当空指令跟随循环计数时设置该标志,而对于 其它指令不设置该标志。HEMi 307还包括局部寄存器模块2703,其控制对HEMi的iRAM 2601和mRAM 2603 的访问。局部地址寄存器2704保持局部存储器中的地址。根据地址的高位,该地址可以在 iRAM或mRAM中。局部数据自动递增寄存器2705保持从局部存储器中读取或写入局部存 储器的双字数据。从该寄存器的写导致局部地址寄存器2704递增。通过将值写入局部地 址寄存器2704,将值载入重复计数寄存器2702、以及执行从mRAM向寄存器2705与从寄存 器2705向另一位置的移动(可以在一个指令中执行这些移动),HEMi可以从mRAM中的连 续地址执行一系列双字的如同DMA的移动。每次循环引起寄存器2704自动递增、以及重复 计数寄存器2702自动递减,并且该移动继续到重复计数寄存器2702到达0为止。注意,如
37果目标(target)类似地使用数据自动寄存器,则该移动将再次被存储在该目标的连续的 地址中,而不需要额外的逻辑或指令。局部数据寄存器2706保持从局部存储器中读取的或写入其中的双字数据,但该 寄存器不引起地址递增。ARM 2002与局部寄存器块2703通过专用端口通信。ARM 2002是能够将地址写入 对应于iRAM 2601的局部地址寄存器2704的仅有资源。ARM2002使用该能力来控制将新固 件覆盖到iRAM 2601中的处理。HEMi 307还包括窗口寄存器2707,其包括五个寄存器,每个都保持HEMi的mRAM 2602中的地址。四个这样的寄存器被用于在mRAM中设立窗口,每个窗口包括128个双字。 这些窗口被用于操纵数据结构,如传输请求和页面请求。例如,如果需要闪存HEMi操作页 面请求,则该页面请求在iRAM中的地址可以被加载到一个窗口寄存器中。接着,对页面请 求的特定区域的访问可以被处理为从窗口寄存器中的值的偏移,因此,当需要对数据结构 重复操作时,简化了地址计算处理。第五窗口寄存器被用于mRAM栈,其存储局部变量与函数自变量。栈窗口寄存器与 其它四个窗口寄存器类似地操作,除了 HEMi具有特别的栈相关的指令之外,该指令自动递 增或递减栈窗口寄存器中的值,并提供用于对栈窗口地址增加偏移的自动化机制,由此允 许一个时钟栈操纵。HEMi内部寄存器(包括局部寄存器块2703和窗口寄存器2707)被“危险(hazard) 检查”。因为HEMi是流水线化的处理器,所以,如果写操作在没有这种保护的情况下紧挨在 移动操作之前,则写可能实际上在移动之后发生。因此,如果写指令将值写入寄存器中,并 且紧挨的后续操作将寄存器内容移动到另一位置,则流水线可以导致在写之前移动寄存器 的旧内容。危险检查通过检查这种情况并延迟后续指令直到已加载了合适的数据而避免这 种可能性。乘法/除法引擎2717被用于执行乘法和除法运算。因为乘法/除法引擎可以与 HEMi的其余部分独立地操作,所以,HEMi可以将要被运算的值写入乘法/除法引擎2717中 的寄存器中,然后在运算进行的同时进入休眠状态,从而省电。上文描述了该休眠模式。手动CRC引擎2719产生针对通过关联的HEMi写入的信息的CRC值。切换字节顺序(Switch-Endian)引擎2720是自动交换写入该寄存器的数据的字 节顺序的32位寄存器。因为不同的协议具有不同的字节排序,所以使用它。数据以小尾数 法(little-endian)格式存在在闪存中,但对于特定协议,其被以大尾数法(big-endian) 格式接收而且必须以大尾数法格式传输。每个HEMi还具有关联的密耦合的逻辑块,例如,密耦合的逻辑块2701。密耦合的 逻辑块2701图示了密耦合到每个闪存HEMi的逻辑。如下所述,密耦合到其它类型的HEMi 的逻辑块在某些方面与密耦合的逻辑块2701不同。因此,即使所有HEMi的内部设计都相 同,不同密耦合的逻辑的使用加上不同固件的使用也允许每种类型的HEMi针对特定的任 务而被定制。密耦合的逻辑块2701包括“密耦合”到HEMi 307的资源,意味着HEMi307是可以 访问这些资源的仅有的HEMi,这些资源共享一个地址空间,并且对这些资源的访问在无等 待状态的基础上发生。
虽然在当前的优选实施例中,密耦合的逻辑在HEMi的外部,但在替代实施例中, 该逻辑中的某些或全部可以被合并到HEMi本身中。密耦合的逻辑块2701包括级缓冲器访问寄存器块2708,其控制对与闪存HEMi关 联的闪存级缓冲器(例如,闪存级缓冲器308)的访问。地址寄存器2709、数据寄存器2710与数据自动递增寄存器2711与共享RAM访问 寄存器块2411中的对应寄存器类似地操作。闪存HEMi使用对级缓冲器的此访问路径,来修改存储在通过级缓冲器的超级块 元数据表中、且在意外的掉电之后的重建期间所需要的时间戳信息(下文联系图58描述该
重建处理)。闪存传输计数寄存器2712、闪存地址寄存器2713与闪存数据寄存器2714控制闪 存组与闪存级缓冲器之间的DMA操作。寄存器2713包含要访问的闪存地址。寄存器2712 包含以双字形式的读或写数量。寄存器2714包含从闪存中接收或要被发送到闪存的数据。DMA地址寄存器2715和DMA传输计数寄存器2716被用于控制数据路径DRAM 107 与级缓冲器之间的DMA传输的级缓冲器侧。寄存器2715保持用于传输的级缓冲器地址,并 且,寄存器2716保持要在级缓冲器与PIO缓冲器之间传输的双字的数量。将值写入寄存器 2716中导致级缓冲器与PIO缓冲器之间的DMA传输的开始。一般地,HEMi可以使用内部移动命令来在内部位置、密耦合的逻辑与某些外部位 置之间移动数据。因此,例如,当需要新固件覆盖时,ARM处理器2002在DRAM地址寄存器 2212中为覆盖建立DRAM地址(如下文所述,固件覆盖被存储在DRAM中),在局部地址寄存 器2704中为覆盖建立iRAM地址,在传输计数寄存器2213中放置来自DRAM传输的数量,并 且,在重复计数寄存器2702中放置传输所需要的双字的数量。从DRAM通过PIO缓冲器到 数据寄存器2214的DMA传输如上所述进行。内部HEMi逻辑引起来自寄存器2214的数据 被写入局部数据自动递增寄存器2705,并且从其被写入到由局部地址寄存器2704所指向 的iRAM位置。接着,重复计数寄存器2702被递减,局部地址寄存器递增,并且该处理重复。 ARM 2002在系统引导时使用该能力将初始固件覆盖加载到每个HEMi的iRAM中。为考虑另一示例,将IOP从共享RAM(见下文,联系图41)复制到HEMi的mRAM中 仅需要四个HEMi命令写共享RAM地址寄存器,共享RAM地址;这将共享RAM中的IOP的地址写入寄存器 2412 中。写局部地址寄存器,mRAM地址;这将IOP被存储到的mRAM中的地址写入寄存器 2704 中。写重复计数寄存器,IOP中的#双字;这将包含在IOP中的双字的数量载入重复计 数寄存器2702。移动局部数据自动递增寄存器,共享RAM数据自动递增寄存器;这将值从寄存器 2413移动到寄存器2705。寄存器2413中的值是寄存器2412指向的共享RAM中的双字。将 该值移动到寄存器2705使其被传输到地址寄存器2704所指向的mRAM位置。指定两个数 据自动递增寄存器自动引起所关联的地址寄存器一旦发生移动时便递增。如上所述,该移 动指令重复,直到重复计数寄存器达到0为止。如此,HEMi可以完成自动发生并利用最小数量的命令的DMA型的访问。
密耦合的逻辑块2701还包括调试寄存器块2718,其包括与向和从调试FIFO 2210 的传输有关的寄存器。如以上所指出,密耦合的逻辑块2701专用于闪存HEMi。与其它HEMi关联的密耦 合的逻辑块不包括级缓冲访问寄存器块2708。用于接收和传送HEMi (例如,接收HEMi 0 1702和传送HEMi 0 1704)的密耦合的 逻辑块包括设计来支持主机端口操作的附加寄存器。在图28中示出这些寄存器。用于接收HEMi的密耦合的逻辑块包含用于与涉及主机端口的接收功能通信以及 对其控制的寄存器,包括以下接收缓冲访问寄存器块2801 其用于设立从接收级缓冲器向数据路径DRAM 107 的DMA传输。该块包括保持用于该传输的DRAM地址的DMA地址寄存器2802、以及保持要进 行的传输的数量的DAM传输计数寄存器2803。接收缓冲计数寄存器2804 其给出接收级缓冲器数据FIFO中的条目的数量。如 果接收HEMi处于休眠模式,则将值写入该寄存器引起接收HEMi唤醒。基元FIFO访问寄存器块2805 该组寄存器与进站基元FIFO 1808通信。这些寄存 器包括顶部寄存器2806 (从FIFO中读,而不改变FIFO的顶部)、弹出寄存器2807 (从FIFO 中读取顶部数据项,并且将FIFO顶部移动到下一数据项)、计数寄存器2808 (包含FIFO中 的数据项的数量)以及添附寄存器2809 (将数据项加入到FIFO的末端)。非数据有效载荷访问寄存器块2810 该组寄存器与非数据有效载荷FIF01804通 信。这些寄存器包括顶部寄存器2811、弹出寄存器2812、计数寄存器2813以及添附寄存器 2814,它们与基元FIFO访问寄存器块中相似名称的寄存器相同地操作。头部大小寄存器2815 其指示当前头部有多长。该值允许接收HEMi在非数据有 效载荷FIFO上的一个头部与下一个头部之间不同。基元匹配寄存器块2816 这些寄存器被用于将值载入基元匹配逻辑1802,来针对 特定协议定制基元匹配逻辑。上文联系图19解释了基元匹配逻辑1802的使用和定制。如上所述,基元匹配逻辑1802包含两组寄存器基元匹配寄存器1902与基元匹配 控制寄存器1903。基元匹配#寄存器2817指向每组中十六个寄存器之一,导致存储在基 元匹配加载寄存器2818中的值被载入基元匹配寄存器1902中对应的寄存器中,并且存储 在基元匹配控制加载寄存器2819中的值被载入基元匹配控制寄存器1903中对应的寄存器 中。WffN散列(Hash)引擎2830被用于产生所接收的64位的全球(Worldwide)名称值 的24位散列。该散列被内部使用,以便所接收的帧(其可以包含发送者的WffN的24位散 列值)可以与启动器表4108 (见下文)匹配,启动器表4108包含64位值。图28还示出唯一的传送HEMi密耦合的寄存器传送缓冲访问寄存器块2820 其被用于设立从数据路径DRAM 107的DMA传送的 传送级寄存器侧。该寄存器块包括DMA地址寄存器2821和DAM传输计数寄存器2822。传送帧缓冲FIFO访问寄存器块2823 该组寄存器与作为传送帧缓冲器1806的部 分的FIFO通信。这些寄存器包括弹出寄存器2824、计数寄存器2825与添附寄存器2826。命令FIFO访问寄存器块2827 该组寄存器与作为传送帧缓冲器1806的部分的 FIFO通信。这些寄存器包括计数寄存器2828与添附寄存器2829。
图29图示了闪存HEMi (例如,HEMi 307)的mRAM的内容1.局部传输请求表2901。其包含用于保持最多六个传输请求的空间。这些传输 请求可以是从共享RAM复制到该闪存HEMi的mRAM中的传输请求与局部传输请求的组合, 局部传输请求被连同内部操作(诸如垃圾收集(见下文))一起发出。例如,存取位置2902 可以存储一个传输请求,存取位置2903可以存储第二个传输请求。2.局部传输请求队列2904。其是存储在表2901中的传输请求的FIFO队列,并且 排队来被闪存HEMi操作。如下所解释,一般地,当与传输请求关联的页面请求已经完成并且传输请求本身 准备好进入完成状态时,传输请求被置于该队列中。3.局部传输请求空闲列表2905。其保持指针列表,该指针指向局部传输请求列表 2901中的存取位置,该存取位置是空的,并因此能够保持新传输请求。4.页面请求表2906。其包含用于保持最多十八个页面请求的空间。每个传输请 求可以调用三个页面请求,于是,页面请求表2906包含用于十八个页面请求的空间,所述 十八个页面请求可以由可以适合闪存HEMi传输请求表2901的六个传输请求调用。在所示 示例中,页面请求表2906包括存取位置2907和2908中的页面请求,存取位置2907和2908 保持用于闪存HEMi传输请求表2901的存取位置2902中的传输请求的页面请求,并且,存 取位置2909中的页面请求用于存取位置2903中的传输请求。在该示例中,其它页面请求 存取位置是空的,意味着这些空间已被分配但当前没有被填入有效的页面请求。5.页面请求空闲列表2910。其是页面请求表2906中的所有空闲页面请求存取位 置的列表,意味着它们当前未保持有效页面请求。因此,该列表表示闪存HEMi可以发出的 新页面请求。6.子组队列2911。其是存储在表2906中的页面请求的一组FIFO队列。闪存组 中的每个子组都有单独的页面请求队列。一旦页面请求准备好被执行,其被添附到用于保 持该页面请求需要从中读或向其写的地址的子组的子组队列的末端。该闪存HEMi在子组 队列之间依次轮换。当其轮换到包含页面请求的子组队列时,其评估该队列上的顶部页面 请求,以确定用于页面请求的继续执行所必需的资源是否可用。如果所述资源可用,则闪存 HEMi执行页面请求所要求的在给定可用资源下可能的那些任务,接着闪存HEMi轮换到下 一子组队列。如此,闪存HEMi以循环的方式处理页面请求,而不需要任何仲裁逻辑。从子 组队列中移除已经完成处理的页面请求。联系图53更详细地解释该处理。在当前实施例中,子组队列是FIFO,并且以接收的顺序处理页面请求。在替代实施 例中,高优先级的页面请求被加入子组队列的顶部,而不是被添附到底部。在该实施例中, 可以基于在调用传输请求中识别特别重要事务的优先级位,在页面请求中设置优先级位。8.超级块空闲列表2912。其包含用于包含在由该闪存HEMi控制的闪存组中的空 闲的并因此可以被写入的超级块的标识符。9.超级块空闲列表计数器2913。其包含空闲列表2912上的超级块的数量。该数 量被单独地作为性能优化而追踪,从而根据需要而并不必须计算它。10.开放超级块指针2914。其保持用于当前对写开放的超级块的编号。11.垃圾收集阈值2915。在当前实施例中,其保持两个变量,两者都被用于垃圾收 集的目的临界阈值与非临界阈值。下文描述这些变量在垃圾收集中的使用。
41
12.局部变量2916。在当前实施例中,其保持各种由HEMi使用的局部变量。13.栈空间2917。其保持由HEMi使用的用于处理任务的栈。14.命令表2918。其保持由当前正被闪存HEMi处理的所有传输请求影响的命令 和LBA范围的列表。如上所述,SSD控制器106增强了读/写一致性,以确保操作不在次序混乱的情况 下完成。命令表2918被闪存HEMi用于增加闪存端口层的一致性。当从闪存HEMi的工作 列表中将传输请求弹出、并将其复制到局部传输请求表2910中时,相对命令列表2918检查 由该传输请求影响的LBA范围。如果重叠存在,则停止传输请求的执行,直到在先传输请求 已经完成,此时,从命令表2918中移除在先传输请求的条目,并且移除对在后传输请求的 保持。一旦传输请求已准备好在闪存HEMi中执行,被该传输请求影响的LBA范围被加入到 命令表2918。15.超级页面指针列表2919。该列表对于闪存组中的每个子组而包含与该闪存 HEMi关联的一个条目。对于每个子组,所关联的条目指向当前开放的超级块中的下一空闲 的超级页面。当超级块初始是开放的,且未包含数据时,子组1-7指向超级页面0,并且,子 组0指向超级页面1 (每个超级块的子组0的超级页面0包含超级块元数据表,并因此不可 用于常规写入)。闪存HEMi使用这些计数器将超级页面分配到包括写命令并因此需要空闲超级页 面的页面请求。当超级页面已经被分配给页面请求时(这在页面请求初始化期间发生),用 于包含该超级页面的子组的超级页面指针列表2919中的条目被递增。注意,在一个实施例中,列表2919可以包含在与开放超级块2914信息相同的数据 结构中。16.子组位图2920。该表对于每个子组保持两个比特。所述两比特之一指示子组 队列顶部的页面请求是否需要该子组操作。第二位指示用于子组的R/B信号是否在准备好 的状态。闪存HEMi在确定是否开始服务页面请求时检查该位图。在图30中图示了使用共享RAM访问寄存器块2411访问共享RAM,其示出了用于传 输来自共享RAM的数据块(例如,传输请求)的步骤序列。在步骤3001中,共享RAM中所期望数据的地址被写入共享RAM地址寄存器2412 中。在该示例中,这是传输请求表4111中传输请求的地址(见下文)。在步骤3002中,数据要被传输到的HEMi mRAM地址被写入局部地址寄存器2704 中。在该情况中,该地址指向局部传输请求表2901中的空存取位置。在步骤3003中,对应于将被需要来完成传输的双字的数量的值被写入重复计数 寄存器2702中。在步骤3004中,HEMi执行引起从共享RAM向共享RAM数据自动递增寄存器2413、 以及从那里向局部数据自动递增寄存器2705的读的命令。从共享RAM的读在共享RAM地址 寄存器2412中指定的地址处发生。向局部数据自动递增寄存器的读导致数据被写入mRAM 中由局部地址寄存器2704指定的位置。两个数据自动递增寄存器的使用引起各个地址寄 存器自动递增。命令的执行引起重复计数寄存器2702递减。注意,HEMi设计允许利用单 个指令处理该步骤。在步骤3005中,重复计数寄存器2702被检查,以确定其是否包含值0。
如果重复计数寄存器2702具有值0 (步骤3005的“是”结果),则传输完成,并且
处理结束。如果重复计数寄存器2702具有超过0的值(步骤3005的“否”输出),则其指示 需要额外的传输。控制返回到步骤3004用于下一双字的传输。注意,在没有闪存HEMi进一步干扰的情况下,步骤3004和3005之间的循环继续。 递增的地址寄存器以及强制执行指令的重复的重复计数寄存器允许HEMi在DMA型的突发 包中快速且有效率地传输数据。F. ECC 处理当数据被写入闪存模块108或从闪存模块108被读取时,SSD控制器106产生和检 查错误校正码(“ECC”)信息(如上所述,数据路径DRAM 107还具有内部ECC能力,但SSD 控制器106不控制该能力,并且,仅在报告错误的情况下与其接口,这引起SSD控制器106 发出错误消息)。在图31中图示ECC处理,其示出闪存端口 0 304。如上所述,闪存端口 0包括闪存 HEMi 0 307与闪存级缓冲器0 308,并且连接到闪存组0 301。图31还示出ECC校正引擎3101。如上所解释,SSD控制器106包括大量闪存端口, 每个具有关联的闪存组。然而,在当前的实施例中,SSD控制器106仅包括单个ECC校正引 擎,其被在闪存端口之间共享。因为仅一个ECC校正引擎存在,所以,当闪存HEMi需要ECC 校正引擎时,其必须检查ECC引擎是否忙碌。如果ECC校正引擎不忙碌,则闪存HEMi可以 使用它。如果ECC校正引擎忙碌,则闪存HEMi必须将其ID添附到包含在全局寄存器2203 中的ECC校正FIFO(见图22)。该FIFO包括需要访问ECC校正引擎的所有闪存HEMi的排 序的列表。当HEMi的ID来到FIFO的顶部时,该HEMi被批准访问ECC校正引擎。在不同的实施例中,SSD控制器106可以包括多于一个ECC校正引擎,最多到总共 每个闪存端口一个。该实施例增加成本和复杂度,但如果必须校正大量的数据,则允许更快 的性能。在该实施例中,不需要闪存HEMi等待访问ECC校正引擎。在其它替代实施例中, 可以对于给定数量(例如,两个或四个)的闪存端口具有一个ECC校正引擎。如图31所示,闪存端口 0 304包括ECC逻辑3102。ECC逻辑3102还包括ECC产 生(ECC Generation) 3103 以及 ECC 检查 3104。ECC产生3103—次为一个区段的数据产生ECC位。当正在闪存级缓冲器308与闪 存组301之间传输数据时这么做。当从级缓冲器向闪存组写入时,与数据一起存储ECC信 息,该ECC信息被存储在S页面区段的ECC字段1303中(见图13)。当从闪存组向级缓冲 器读取时,ECC信息被ECC检查3104使用,如下所述。在当前的优选实施例中,ECC产生3103使用汉明(Hamming)算法为每个区段产生 十二个ECC码元,因此每个区段使用12个ECC字节。这需要略少于20个字节用于存储,并 且,由于此原因,S页面区段的ECC字段1303包括20个字节。基于在初始化时在ECC逻辑 3102中设置的寄存器,每个区段产生的ECC的量可被编程的。在替代实施例中,通过将ECC 大小设为0,并重新安排或消除由其它字段占据的空间,将可以缩小S页面区段的大小,并 因此允许每个超级页面保持16个区段(并因此处理16个LBA)。当从闪存组301中读取数据时,ECC产生3103为每个区段产生ECC位的新集合。 然后,ECC检查3104将新产生的ECC位与ECC字段1303的内容比较。使用标志传达该比较的结果,该标志指示是ECC位匹配还是发现了错误。在本领域中公知用于产生和检查ECC 信息的方法,这里不再描述。当ECC检查3104发现ECC错误时,闪存HEMi 307将区段数据和元数据(包括ECC 字段1303)从级缓冲器308复制到ECC校正引擎3101中。ECC校正引擎使用ECC字段1303 的内容来设法校正在写入或读出闪存组301的过程中引入到数据中的错误。再次,本领域 中公知ECC校正处理的细节,这里不再描述。在当前的优选实施例中,基于约20个字节的 ECC信息,ECC校正引擎能够校正每区段十二个错误。如果ECC校正引擎3101成功校正了数据,则闪存HEMi 307获取从ECC校正引擎 3101的输出,并将其写回级缓冲器308中,然后,已校正的数据被用于最终向主机的传送 (从以上讨论,联系图27应该理解,虽然涉及两个传输,但HEMi设计允许使用单个HEMi指 令将数据的每个双字从ECC校正引擎3101传输到级缓冲器308)。如果错误的数量太大以 至于ECC校正引擎3101不能校正,则调用第二级的错误校正协议。该协议具有两个阶段。 在第一阶段,从闪存组向级缓冲器的读被重复一次或多次,再次以相同的区段启动错误校 正循环。这么做是因为错误有时来自在报告一个状态与另一状态之间阈值处的单元,并且 重读可以产生额外的有效位。如果ECC校正引擎能够第二(或后续)次校正该数据,则进 行校正,物理区段被标记为“坏”,并且数据被重新写入另一区段。在第二级错误校正协议的第二阶段中,数据被重复地读取并且与在前读取的结果 一起“或”。由于“或”操作,如果在任何读取期间,比特位置处遇到“1”,则将保持该“1”,即 使该比特位置处的值在在先或在后读取期间被读为“0”也是如此。使用该过程是因为闪 存错误通常来自电荷从闪存单元的泄漏,导致该单元中的值被读为“0”而不是“1” (例如, 读干扰)。因为该泄漏可以导致单元中具有在0和1之间的中间电荷水平,所以不同的读可 导致不同的值返回。“或”处理最大化了从读中接收的1的数量。一旦已经完成“或”处理 设定次数后,该值被返回ECC校正引擎3101,以确定该数据现在是否可以被校正。如果数据破坏来自单元中的电荷增加,从而“0”值被间歇地读为“ 1 ”,则“或”处 理可以实际上提高数据破坏。然而,该情况相对稀少,尽管仅在第二级错误校正的第一阶段 (没有“或”的读取)失败之后使用“或”处理才有道理。如果ECC校正引擎3101最终不能校正该数据,则闪存HEMi发出错误消息,其被通 过主机端口发送到与数据关联的启动器。在当前的优选实施例中,已校正的错误不被写回到闪存中,除非错误数量超过了 阈值。基于可校正的错误数量(在当前实施例中,每个区段12个)减去基于在后续读中引 入额外错误的可能性而计算的保护带,来设置该阈值。在当前的优选实施例中,发明人已经 确定在区段读中发现的错误的数量不大可能比在该区段的紧挨在前的读中发现的错误的 数量多三个(或少三个)以上。因此,例如,如果在一次读时,区段具有三个可校正的错误, 则在下一次读时,其很可能具有六个或少于六个的可校正错误。应该理解,该行为意味着,如果在一次读时,区段具有九个或少于九个可校正错 误,则很可能在下一次读时,该区段将具有十二个或少于十二个错误,意味着在下一次读 时,该错误将可校正。这,接着,意味着不必要将已校正的错误写回闪存。避免这样的写很 重要,因为将已校正的数据写入闪存需要重写整个超级页面。在当前实施例中,保护带被设为四,而不是三,以进一步最小化在后续的读上发现
44不可校正的错误的可能性。因此,在读上发现的可校正的错误的阈值设为八。如果发现多 于八个错误,则调用写处理程序,并且将包括已校正数据的、包含该区段的超级页面重写入 闪存。如果发现少于八个错误,则不重写该超级页面,这是因为,预见到该数量的错误在下 一次读时仍将可校正。在替代实施例中,因为在某些区段中的错误的存在意味着相邻区段也包含错误, 可以识别包含错误的超级块用于优先垃圾收集。优先垃圾收集包括一定的无效率性,因为 所选择的超级块将很可能比未选作优先的超级块包括更多有效的数据(见下文对垃圾收 集的讨论),但该无效率性比由立即重写任何发现一定错误的超级页面所施加的无效率性
小得多。IV.元数据结构A. DRAM 结构图32图示数据路径DRAM 107中发现的数据结构,在系统初始化时设立和初始化 它们中的每个。它们包括以下结构转发表3201,其被用于在LBA地址和闪存地址之间转换。联系图33更详细地描述该表。IOP数据缓冲器3202,其存储在主机接口 310与闪存模块108之间传输的数据。ARM执行代码3203,其存储由ARM处理器2002执行的软件。在当前的优选实施例 中,用C++编程语言编写该软件。ARM数据3204,其构成由ARM处理器2002在处理期间使用的存储空间。反转(reverse)表块3206,其用于垃圾收集以及从掉电中恢复。反转表块3206为 每个闪存端口包含单独的表,例如,表3205包含用于闪存端口 0的反转表。联系图34更详 细地描述反转表3205。超级块元数据表块3207,其为每个闪存端口包含用于当前开放的超级块的元数据 表。联系图35进一步描述这些表。HEMi代码覆盖表3208,其包含初始化时载入每个HEMi中的固件。该表为每种类 型的HEMi包含八个代码覆盖,例如,条目3209包含用于两个接收HEMi的八个固件覆盖,条 目3210包含用于两个传送HEMi的八个固件覆盖,等等。根据需要以上文详细解释的方式 将这些覆盖交换进和交换出HEMiiRAM。SCSI标签表3211,其对于每个当前有效的启动器包含一行,并且,对于根据SCSI 协议允许用于SCSI标签的65536个可能值中的每个包含一列。当接收到包含特定SCSI标 签的⑶B时,在对应于该启动器和该SSCI标签的SCSI标签表位置设置该比特。当⑶B的 执行已经完成时,清除该比特。这允许SSD控制器106检查,以确保所有接收到的SCSI标 签都是唯一的,并且启动器从不具有带有相同SCSI标签的两个有效CDB。调试缓冲器3212,其是存储从调试FIFO 2210接收的调试数据的循环缓冲器。响 应于HEMi固件中的调试命令,在常规系统操作期间收集所述调试数据。所收集的信息包含 所接收的CDB的基本命令流以及作为结果产生的数据结构(CDBInfo、Ι0Ρ、传输请求)。在 检测到错误的情况中,收集附加调试信息,以识别错误的类型以及对错误做出的响应(如 果存在)的性质。图33示出了转发表3201。转发表3201被用于将从主机101和102接收的LBA地址转换为闪存模块108中的实际物理闪存地址。由LBA对转发表3201进行索引,并且,转发表3201对于系统可以支持的每十五个 LBA包含一个条目。如图33中所示,转发表3201中的第一条目涉及LBA 0_14,第二条目涉 及LBA 15-29,第三条目涉及LBA 30-44,等。注意,每个条目的LBA的数量与可以被存储在 超级页面中的LBA的数量相同。在包括更大或更小的超级页面的不同实施例中,每个转发 表条目的LBA的数量将同样变得更大或更小。转发表3201的大小取决于闪存模块108的总存储大小。在当前的优选实施例中, 300G字节的闪存模块可以存储约6亿个LBA,由此在转发表3201中需要约4000万个可能 的条目。对于更大或更小量的存储量,转发表3201的大小将相应地更大或更小。对于每个LBA条目,转发表3201包括可以被用于识别物理闪存芯片上相应数据的 位置(端口、子组、块和页面)的信息。此外,转发表3201包含标记为“用户”的字段,其可以存储特定客户可以发现有用 的信息。在一个实施例中,用户字段存储所关联的LBA在预定的维护期间(例如,一个月) 中已经访问(读或写)的次数。用户可以使用该信息来确定LBA的特定组包含较经常使用 还是较不经常使用的信息。经常使用的信息可以被移动到较快、较高成本的存储器中。不 经常使用的信息可以被移动到较慢的档案存储器中。在操作中,转发表3201如下操作从主机接收LBA,例如,LBA23。将LBA除以15, 整数商被用于获得进入转发表3201的索引。例如,对于LBA23,除以15给出商“1”,意味着 通过对进入转发表的一行进行索引而发现对于该LBA的物理地址信息。在图33中,其为标 注为LBA 15-29的行。所选择的行识别存储LBA信息的端口,并因此识别用于访问该信息的闪存HEMi和 闪存组。所选择的行还识别存储信息的特定子组,并由此识别被所选择的闪存HEMi使用来 选择该信息的CS信号。所选择的行还识别在其中发现信息的块。注意,这是在子组的每个芯片上的相同 的块。最后,所选择的行识别在其中发现信息的页面。例如,该行可以识别块1的页面 1 (应该理解,在该示例中,LBA将实际地存储在块1的超级页面1中)。如上所述,每个超级页面包括十五个S页面区段,每个区段可以存储涉及单个LBA 的内容。一旦已经从转发表3201中识别了超级页面,通过从上述除法中获取余数而获得超 级页面中的实际S页面区段。在所给定的示例中,余数是8(23/15 = 1,余数8)。因此,将 在每个选择的页面中的第九个P区段存取位置中发现所请求的LBA信息(第九,而不是第 八,这是因为,表从LBA 0开始)。图34示出反转表3205。如上所述,数据路径DRAM 107对于每一个闪存组包含一 个反转表。如上所述,每个块包括64个超级页面,每个超级页面由来自四个页面的存储空间 构成,子组中的每个电路小片一个。还如上所述,超级块包括来自该组中的每个子组的相同 块。例如,特定闪存组的超级块0包括来自该组中的所有子组的所有块0。列3401表示超级块(0),行代表子组0的超级页面0_63、子组1的超级页面0_63 等,一个子组上的每组64个超级页面表示块。
表3205中的每个超级页面行(例如,行3402)包含用于每个超级块中的相同超级 页面(例如,超级块0-n的超级页面0)的条目。反转表3205中的每个超级页面字段包括单个有效位。当设为“1”时,该有效位指 示该超级页面包含当前有效的编程数据(即,该超级页面已经被写入了保持有效的数据), 或者已被擦除并可用于写入(即,包含值Oxffffffff,其是擦除后的缺省状态)。当被设为 “0”时,该有效位指示超级页面包含无效数据,意味着其不可以被读取也不可用于写入。当 存储在超级页面上的LBA被进行了之后的写入时,使该超级页面无效。因为闪存不允许直 接的覆写,所以,当超级页面上的LBA被覆写时,该新数据与该超级页面上任何保持有效的 旧数据一起被复制到新页面,并且,旧超级页面被标记为无效,意味着其不再被使用(未决 的(pending)垃圾收集,其在下文被描述)。因此,例如,字段3403中的“1”将指示闪存组的子组0的块0的超级页面1含有 有效数据、或者已经被擦除且可用于写入,然而,该字段中的“0”将指示闪存的子组0的块 0的超级页面1是无效的。反转表3205还包含计数行。该行中的每个条目包含表示超级块中当前无效的超 级页面的总数量的数。因此,字段3404存储表示超级块0中当前无效的超级页面的数量的 数。也可以通过对列中“0”有效位的数量求和来计算该计数。但是,计数被单独地保 持,作为性能优化,这是因为,在单独字段中保持总计数避免了在需要时计算该数的必要。 该计数以下文更详细描述的方式用于垃圾收集目的。反转表3205还包含时间戳行,如行3405所示。其包含指示最初每个超级块对写 关闭的时间的时间戳。该字段的使用包括重建处理,下文联系图58对其描述。反转表3205还包括擦除计数行,如行3406所示。其包含超级块已经被擦除过的 次数的计数,并且,可以被用于例如以更高的擦除计数按优先级排序超级块,以用于垃圾收集。图35图示了超级块元数据表3501,其包含涉及一个超级块的元数据信息。超级块 元数据表被存储在每个超级块的子组0的超级页面0中(例如,用于端口 0的超级块0的 超级块元数据表被存储在端口 0的块0的超级页面0中)。此外,用于每个闪存组中当前对 写入开放的超级块的超级块元数据表被存储在DRAM 107的超级块元数据表块3207中。超级块元数据表3501对于超级块中的每个超级页面包含一行,通过子组组织超 级页面。因此,行3502包含用于子组0的超级页面0的信息。行3503跟随其后,行3503 包含用于从子组0的超级页面1直到子组0的超级页面63的信息,随后是行3504,其包含 用于从子组1的超级页面0直到所到达的最后一个子组(图35中标记为子组η)的信息。超级块元数据表3501对于每个超级页面存储三种类型的元数据超级页面时间 戳、缺陷标志以及LBA。超级页面时间戳列3505包含超级页面被写入的时间。该信息还被添附到超级页 面的末端,并被用于在数据丢失情况下以下文描述的方式重建的目的。缺陷标志列3510包含指示超级页面是否已被标记为“有缺陷”的单个比特。如果 在闪存读或写期间来自超级页面的任何页面被指示为有缺陷,则超级页面被识别为有缺陷 的。在一个实施例中,如果这在读期间发生,则超级块被强制进入垃圾收集。在一个实施例
47中,如果这在写期间发生,则不同的超级页面被用于写。在任一情况下,都设置该缺陷标志。LBA列3511包含写入到超级页面中的数据的LBA地址。如以上所解释,每个页面 包含来自一组15个连续LBA的数据。LBA列3511识别该组中的第一个LBA。子组0的超级页面0是特殊情况,这是因为,其包含用于超级块的超级块元数据 表,并因此不保持对应于任何LBA的数据。为此原因,与该超级页面关联的LBA字段不包含 LBA信息。超级块元数据表3501还包含不专用于特定超级页面的四个字段,而是包含与整 个超级块相关的元数据超级块时间戳3506、擦除计数字段3507、开放标志3508以及关闭 标志3509。超级块时间戳3506包含反映对写关闭的超级块的时间的时间戳,如下所述,该字 段被用于掉电恢复。擦除计数字段3507包含超级块已被擦除的次数。如下所述,该字段可以被用于磨 损均衡(wear leveling)目的。当超级页面对写开放时,设置开放标志3508。当超级页面被关闭时,设置关闭标志3509。如下所述,开放和关闭标志被用于掉电恢复。当超级块对写开放时,其元数据表被从闪存复制进DRAM 107中。当每个超级页面 被写入时,将合适的LBA写入对应于该超级页面的LBA字段中,并且将超级页面被写入的时 间写入列3505中的超级页面时间戳条目。类似地,如果超级页面被发现有缺陷,则填充对 应于该超级页面的缺陷字段。当超级块被关闭时,所关联的超级块元数据表被从DRAM 107写入到包含该超级 块的闪存组的子组0的块0的超级页面0中,并且接着通过用于下一个要开放的超级块的 超级块元数据表而被覆写在超级块元数据表块3207中。超级块元数据表在三个单独的情形中被写入闪存中1.当超级块被擦除并被置于空闲列表上时。此时,元数据表被写入闪存中,然而, 仅缺陷和擦除计数数据是有效的。2.当超级块开放时。此时,该表被复制到级缓冲器中。闪存HEMi设置开放标志, 并将该表写回到闪存中(不过,应该理解,副本保留在级缓冲器中,并且,仅表的部分需要 被写入闪存中)。这允许开放的超级页面在不可预见的掉电的情况中被识别。3.当超级块被关闭时。此时,被填充了的表被复制回到闪存中。在那发生之前,闪 存HEMi设置关闭标志。因此这两个标志指示超级块的所有可能的状态空闲(两个标志都 未被设置)、开放(开放标志被设置、关闭标志未被设置)、以及关闭(两个标志都被设置)。图36图示IOP数据缓冲器3202。如图32所示,IOP数据缓冲器3202被存储在数 据路径DRAM 107中。该缓冲器被用于缓冲由数据路径DRAM107从主机接口 310、或从闪存 模块108接收的数据。IOP数据缓冲器3202对于每个可以被SSD控制器106支持的IOP包含一行(在当 前优选实施例中,其为60)。每行对于保持315个S页面区段都足够大,315个S页面区段 是对于IOP来说可以返回的最大数据量(7个传输请求X3个页面请求X 15个LBA)。在写操作时,IOP数据缓冲器3202保持从主机接收的数据。在读操作时,数据缓冲器保持从闪存接收的数据。在任一情况中,都以LBA顺序来存储数据。这使得计算用于 涉及特定传输请求和特定页面请求的数据的准确位置更容易。例如,涉及由IOP发出的第 一传输请求的第一页面请求的数据将始终在数据缓冲器3202中该IOP的条目的开始处被 发现(IOP(O)的第一位置被示为位置3601)。涉及第一传输请求的第二页面请求的数据将 始终在从该条目的开始的偏移处(例如,位置3602)被发现,基于要被第一页面请求传输的 LBA的数量计算所述偏移(注意,如果传输的起始LBA落入超级页面内,则该第一页面请求 将传输少于完全的超级页面)。因此,根据主机发起的读和写操作被分为可以在不同时间或无次序地完成的传输 请求和页面请求的事实,IOP数据缓冲器3202操作来隔离向和从主机101和102的数据流。 尽管数据传输具有乱序性质,但IOP数据缓冲器3202以主机期望的LBA顺序存储数据。对于主机发起的读,IOP数据缓冲器3202保持由传输请求返回的数据直到所有请 求的数据出现,此时,数据被以LBA顺序读出到主机接口。对于主机发起的写,IOP数据缓 冲器3202保持从主机接收(还以LBA顺序)的数据,直到所有数据都已被接收,此时,数据 被传输到闪存级缓冲器。该机制也允许SSD控制器106即使主机发起的数据传输操作被内 部分为小得多的闪存读和写、也以主机期望的顺序向和从主机接受和传送数据,并且还允 许数据路径DRAM以最大的速度操作,而不管控制器中的其它元件以较低的速度传输数据 的事实。B.事务结构如上所述,SSD控制器106使用四种类型的数据结构在闪存模块108中控制读和 写操作⑶Binfos、Ι0Ρ、传输请求和页面请求。如基于SCSI协议的系统中所常规的,通过从主机接收到命令描述器块(“⑶B”) 而发起读或写(其它协议包括类似机制,但CDB将被用于阐述的目的)。SSD控制器106以 被称为⑶Binfo的结构存储⑶B。控制器可以一次处理最多144个⑶Binfo,不过,如下文 更详细地描述的,其中的16个被保留用于特殊目的,从而可以一次处理128个标准的主机 发起的读/写命令,尽管它们中的某些可能正被“暂停”,等待必要资源的可用性。SSD控制器106通过将主机发起的读和写命令分为分级移动来处理主机发起的读 和写命令。系统通过产生IOP来处理⑶Binfo而开始。一次总共可以有60个IOP是有效 的。每个IOP可以发出七个传输请求(尽管一次最多仅可以有120个传输请求是有效的), 它们中的每个可以发出三个页面请求。每个页面请求引起最多一个超级页面(例如,超级 页面213)的数据和元数据的移动。如上所解释,每个超级页面存储与15个LBA关联的区 段内容。该结构被设计来允许单个IOP处理大多数主机发起的传输,其包括256个连续 LBA。如下所解释,根据要被传输的第一个和最后一个LBA落入超级页面内的位置,以及它 们落入数据分条内的位置,第一个和/或最后一个页面请求将可以仅仅传输一个LBA,以 及,第一个和/或最后一个页面请求还将可以仅仅传输一个超级页面。因此,在某些情况 中,在序列中的第一个和/或最后一个传输请求实际上可以传输仅与单个LBA关联的区段 内容。因此,单个IOP能够处理至少225个LBA,并且最多315个。然而,在实践中,IOP可 以处理少于256个LBA的情况相对较少,从而,在当前结构中,单个IOP将几乎总能够处理 包括256个LBA的事务。
如SCSI协议所要求的,通过重复地调用相同的Ι0Ρ,系统可以处理更多数量的LBA 的传输。然而,根据经验,发明人相信256个LBA将是通常操作情形下实际上遇到的最大移 动。注意,每个LBA对应于一个标准硬盘驱动器区段,并且IDE驱动器一般一次仅能传输 256个区段。假如设计现有主机,以满足该256区段限制,则可能单个IOP将能够处理所遇 到的绝大多数主机发起的传输。图37图示了示例性CDBinfo (例如,CDBinfo 201)的结构。自指针3701识别该特定CDBinfo在CDBinfo表4109中的位置,以下联系图41对 其描述。该值被传递到其它需要识别该CDBinfo的数据结构。自指针3701被用于调用CDBinfo 201,并通过希望使用该CDBinfo的操作为此目 的而复制。此外,自指针3701被用于错误检查。自指针3701应该始终指向⑶Binfο 201。 如果其不指向其自身,则意味着有操作利用不正确的数据覆写了该CDBinfo。注意,该描述 对于包含在其它类型的数据结构中的自指针也正确。⑶B字段3702包含从主机获得的⑶B (或类似数据结构)的副本。由主机协议指 定⑶B的格式,但⑶B始终至少包含命令、用于数据传输的LBA以及传输长度。启动器字段3703包含指向共享RAM启动器表4108 (见图41)中对应于负责该⑶B 的启动器的启动器条目的指针。从由带有该CDB的主机提供的元数据获得该信息。将该元 数据与启动器表4108比较。如果发现匹配,则指向启动器表4108中匹配位置的指针被置 于启动器字段中。如果未发现匹配,则从启动器空闲列表4112(见图41)中弹出新启动器, 新启动器被输入表4108中,并且,指向该新启动器的指针被置于启动器字段3703中。IOP字段3704指向被产生来执行CDBinfo所要求的事务的Ι0Ρ。SCSI标签3705包含从启动器接收的SCSI (或队列)标签。如在本领域中所理解 的,当最初形成连接时,SCSI标签是从启动器接收的信息的一部分。在对CDB的任何响应 中,该信息都必须被返回到启动器。SCSI标签3706包含SCSI协议所要求的标志。突发包长度控制字段3707包含从启动器信息突发包长度字段4204复制的突发包 长度控制信息,下文联系图42对其描述。参考标签字段3708包含连同⑶B —起接收的参考标签(如果存在),上文解释了 它们的使用。应用标签字段3709包含连同⑶B —起接收的应用标签与应用标签掩码(如果存 在),上文解释了它们的使用。图38图示IOP (诸如IOP 202)的内部结构。如下所述,IOP被存储在共享RAM块 318的IOP表4110中(见图41,下文),并且,当IOP被HEMi使用时,该IOP还被复制到该 HEMi 的 mRAM 中。在当前的优选实施例中,每个IOP是包含以下字段的32双字的数据结构自指针3801。其包含共享RAM IOP表4110 (见下文)内该IOP所处的地址。在初 始化时设置该字段。当IOP在IOP空闲列表4103 (见下文)上时,这是IOP中唯一包含有 效数据的字段。调用HEMi字段3802包含用于当前操作该IOP的HEMi的标识符。这是被授权修改 IOP 202中任何数据(除了中止(Abort)标志3811,下文对其进一步描述)的唯一 HEMi。
主机端口字段3803识别接收引起IOP的调用的初始主机命令的主机端口(0或 1)。如下所解释,当命令完成时,这是IOP必须被发送到的端口。启动器字段3804包含指向共享RAM启动器表4108 (见下文)中对应于初始负责 导致该IOP的调用的CDB的启动器的启动器条目的指针。CDBinfo字段3805包含指向共享RAM CDBinfo表4109 (见下文)中引起该IOP被 调用的⑶Binfο的指针。命令字段3806识别IOP被指定来执行的命令的类型。在一个实施例中,仅为主机 的读或写命令产生Ι0Ρ。在不同的实施例中,还可以为其它类型的命令产生Ι0Ρ。在该实施 例中,IOP被传送到ARM处理器2002用于非读/写命令的处理。已分配传输请求字段3807包含IOP已经为当前读或写操作分配的传输请求的数 量。当IOP被RdWr HEMi初始化时,该HEMi计算执行由CDBinfo指定的读或写命令所必需 的传输请求的数量,并将该数量输入到该字段中。在当前优选实施例中,该数量被设置为最 大值7。剩余传输请求字段3808包含由还未完成的IOP分配的传输请求的数量。当IOP被 初始设立时,该字段包含与已分配传输请求字段3807相同的值。随着每个传输请求完成, 剩余传输请求字段3808被递减。传输请求指针阵列3809对于IOP分配的每个传输请求包含一个条目。对于每个 这样的传输请求,传输请求指针阵列3809包含指向正在处理传输请求的闪存HEMi的指针, 以及指向传输请求表4111 (见下文)中该传输请求自身的指针。当传输请求从传输请求空 闲列表4104(见下文)中弹出时,从传输请求的自指针(见下文)复制指向传输请求的指 针。传输请求指针阵列字段3809被用于识别当IOP的执行完成时应该被返回到传输 请求空闲列表4104的传输请求。在IOP的中止标志3811被设置的情况下,该字段还被用 于识别应该被中止的传输请求。下文进一步描述中止操作。状态变量字段3810包含用于追踪IOP的状态的信息,包括关于命令是否完成、错 误是否发生等的信息。该字段还指示IOP是新的还是“再进入的(re-entrant)”。如上所 述,如果CDB需要传输比单个IOP可以处理的数据多的数据,则传输被分解为段,并且相同 的IOP被重复地调用,以处理每个段。状态变量字段3810追踪IOP在该处理中的位置。中止标志3811。该标志指示IOP的操作应该被中止。这是IOP可以被除了在调用 HEMi字段3802中识别的HEMi外的任何HEMi写入的仅有部分。参考标签字段3812包含参考标签,上文描述了它的使用。应用标签字段3813包含应用标签掩码与应用标签,上文描述了它们的使用。图39图示了传输请求(如传输请求203)的内部结构。在初始化时,为每个传输 请求在传输请求表4111 (见下文)中分配包括16个32位双字的空间。在当前优选实施例 中,仅使用这些双字中的14个。为将来的扩展保留附加的两个双字。传输请求是由RdWr HEMi创建并由闪存HEMi使用的数据结构。它们包含以下字 段自指针3901。其识别传输请求表4111 (见下文)中的特定传输请求的位置。其被 传递到其它需要识别该传输请求的数据结构,例如,需要识别调用传输请求的页面请求。
调用IOP字段3902。其包含引起该传输请求被创建并从IOP自指针3801取得的 IOP的识别。LBA字段3903。其包含用于该传输的起始LBA。例如,如果调用的IOP需要从LBA 0-100中读,则用于第一个传输请求的LBA字段3903将读为“0”,用于第二个传输请求的 LBA字段3903将读为“45”,以及用于第三个传输请求的LBA字段3903将读为“90” (如上 所解释,每个传输请求可以处理最多45个LBA)。传输长度字段3904。其包含要被传输的LBA的数量。数据路径DRAM指针3905。其包含指向IOP数据缓冲器3202中为该传输请求数据 被写入或被读出的地址的指针。如上所解释,IOP数据缓冲器3202由IOP组织,并且包含 用于从闪存模块108中读取或被写入到该闪存模块的数据的空间。中止标志3906。该标志指示传输请求的操作应该被中止。在传输数据之前由传输 请求检查中止标志,以确保不为已经中止的命令传输数据。下文进一步描述中止处理。命令字段3907。其识别所请求的命令的性质。可能的状态包括读、写、格式化、移 动以及擦除。状态变量3908。它们包含用于追踪传输请求的当前状态的变量。当闪存HEMi开 始对传输请求的操作时,其检查这些变量,以确定需要什么类型的执行。例如,“完成”状态 变量告知闪存HEMi 传输请求已完成,以及清理(clean-up)例程(下文描述)应该开始。参考标签字段3909。其存储用于作为传输请求的对象的第一区段的参考标签。从 调用的IOP的参考标签字段3812取得该信息,然而,对于除由IOP调用的第一个传输请求 外的传输请求,必须对其进行调整。应用标签字段3910。其存储应用标签和应用标签掩码。从调用的IOP的应用标签 字段3813中取得该信息。已分配页面请求字段3911包含传输请求已经为当前读或写操作分配的页面请求 的数量。在当前优选实施例中,该数量设置为最大3。剩余页面请求字段3912包含传输请求分配的还未完成的页面请求的数量。该字 段起初包含与已分配页面请求字段3911相同的值。随着每个页面请求完成,闪存HEMi递 减剩余页面请求字段3912。页面请求指针阵列3913。该字段包含指向分配来处理传输请求所要求的传输的每 个页面请求的指针。已分配页面请求字段3911、剩余页面请求字段3912以及页面请求指针阵列字段 3913不包括在存储在共享RAM中的传输请求表4111 (见下文)中的传输请求中。相反,当 传输请求被存储在闪存HEMi的mRAM中时,在下文更详细解释的处理中,将这些字段加入到 传输请求。图40图示页面请求(如页面请求210)的结构。页面请求被存储在闪存HEMi的 mRAM中。当闪存HEMi从RdWr HEMi接收到传输请求时,闪存HEMi设立执行该传输请求所 必需的页面请求,并且利用识别这些页面请求的信息填充传输请求的页面请求的指针阵列 3913。每个页面请求包括以下字段页面请求自指针4001。其指向闪存HEMi的mRAM中的页面请求表2906中保持该 页面请求的页面请求的位置。
52
调用传输请求4002。其包含用于调用该页面请求、并从传输请求自指针3901中复 制的传输请求的标识符。命令字段4003,其被从调用的传输页面的命令字段3907中取得。该字段中的可能 的值包括读写读/修改/写擦除注意,如果传输请求中的命令字段3907是“写”,并且页面请求的传输长度字段 4010 (见下文)指示该写针对少于完整页面,则设置读/修改/写状态。如下所解释的,在 该情况中,需要读/修改/写,这是因为,闪存写以每次一个完整页面发生,并且,如果页面 请求是写入少于完整的超级页面,则旧超级页面的剩余部分必须被复制和写入到新超级页 面中。数据路径DRAM指针字段4004。其被从传输请求的DRAM指针字段3905获取,但 被修改来反映设计该特定页面请求的数据应该被置于哪里或者应该在分配给传输请求的 DRAM空间中哪里发现它(例如,将在传输请求空间的开始处发现涉及第一个页面请求的数 据,涉及第一个页面请求的数据将被偏移到传输请求空间中,等等)。S页面索引字段4005存储进入表示正被该页面请求处理的LBA范围的转发表 3201的索引。基于传输请求LBA字段3903产生该信息,根据需要而修改它,以反映由于相 同传输请求而发起的其它页面请求。闪存读地址字段4006。其包含闪存组中读将发生的地址,并且通过子组、块和页 面识别位置。从转发表3201获取该信息。当闪存HEMi接收到传输请求时,闪存HEMi使用 来自传输请求的LBA字段3903中的信息来发现对应于转发表3201中的LBA的闪存地址信 息。如上所解释,通过将LBA除以15来找到转发表中的行,并使用来自所述除法的余数来 识别区段的物理位置,将LBA转换为物理闪存地址。闪存写地址字段4007。其包含被页面请求用于写的闪存组地址,并且基于要用于 写的超级页面来计算其。下文描述超级页面被选择的方式。因为读_修改-写需要读地址 和写地址字段两者,所以页面请求包括两者。头长度字段4008。在传输在超级页面的中间开始的部分传输的情况中,该字段保 持LBA在超级页面的开始与传输假定开始的位置之间的偏移。通过取得用于确定闪存读地 址或闪存写地址(见上文)的LBA并将其除以15来计算该字段。来自该除法的余数被用 于头长度字段。尾长度字段4009。在传输在超级页面中间结束的部分传输的情况中,该字段保持 LBA在超级页面的末端与该传输假定结束的位置之间的偏移。通过将头长度字段4008中的 值加上传输长度字段4010中的值并从“15”减去结果值来计算该字段。传输长度字段4010。其指定该页面请求所需要的传输的长度。由闪存HEMi基 于传输请求的传输长度字段3904以及该特定页面请求将被要求处理的传输部分产生该信 息。注意,头长度字段4008、尾长度字段4009与传输长度字段4010的总和将始终是单个超 级页面中的LBA的数量(在当前实施例中为15)。
53
状态变量字段4011。该字段由一系列用于追踪页面请求210的当前状态的标志构 成。联系图51和图53描述使用状态变量的示例。可以同时设置多个标志,但某些组合不 合法。在当前的优选实施例中,该字段包括以下标志,然而,应该理解,所使用的准确标志是 实施相关的,并且不同集合的状态标志可以被用于获得相同的结果命令其指示页面请求准备好向闪存发出命令准备好/等待其指示页面请求准备好进行,以及等待资源可用需要级缓冲器其指示页面请求需要闪存级缓冲器来进行闪存传输完成其指示页面请求所需要的闪存读或写完成第一、第二 其指示事务的当前阶段。例如在读/修改/写中,在事务的不同阶段, 需要页面请求向闪存发出不同的命令。该字段允许页面请求追踪其在该处理中的位置。页面请求完成其指示页面请求已经完成所有必须的操作。数据传输错误其指示由页面请求处理的传输导致了错误。参考标签字段4012存储被页面请求寻址的数据的第一个区段的参考标签。从调 用的传输请求的参考标签字段3909获取该信息,然而,对于除由传输请求调用的第一个页 面请求外的页面请求,偏移是必要的。应用标签字段4013存储从调用的传输请求的应用标签字段3910中取得的应用标 签和应用标签模板信息。C.共享RAM结构图41图示存储在共享RAM块318中的信息。共享RAM块318包含涉及启动器的两个数据结构启动器空闲列表4112和启动器 表 4108。在当前实施例中,SSD控制器106能够响应来自十六个同时有效的启动器的命令。 因此,启动器表4108包含十六个存取位置,其中每个都包含用于涉及单个启动器(指示为 启动器0-15)的信息的空间,例如,启动器信息块4101,下文联系图42对其进一步描述。虽 然SCSI协议要求SSD控制器106响应至少十六个有效的启动器,但在替代实施例中,可以 将SSD控制器106设计通过提高启动器表4108和启动器空闲列表4112的大小,以响应比 该协议所需要的数量更多的启动器。启动器空闲列表4112是包含指向启动器表4108中空存取位置的指针的深度 16(16-deep)的FIFO队列。当新启动器最初寻求与SSD控制器106通信时,来自启动器空 闲列表4112的顶部的指针从队列中弹出,并且启动器列表4108中由该指针引用的存取位 置(例如存取位置4101)被用于有关新启动器的信息的存储。如果启动器列表4112是空 的,则其指示SSD控制器106不能处理任何额外的启动器。SSD控制器106可以通过经由主 机接口 310提供状态信息而响应该情形。应该理解,将启动器信息传递到SSD控制器106的方式是协议特定的。然而,一般 地,在启动器首次开始发起SSD控制器处指示的命令之前提供的数据结构中传递该信息。 该数据结构中的信息被用于填充启动器表4108中的启动器的条目。共享RAM块318包含两个涉及CDBinfo的数据结构CDBinfo表4109和CDBinfo 空闲列表4102。CDBinfo表4109包含用于144个CDBinfo (标记为CDBinfo 0-143)的存取位置。这些存取位置中的每个存储单个⑶Binf0,例如,⑶Binfο 201。联系图37描述存储在⑶Binfo 中的信息。空闲列表4102是包含指向⑶Binfo表4109中空存取位置的指针的深度144的 FIFO队列。当需要新⑶Binfo时,从空闲列表4102的顶端弹出指针。然后,将用于新 ⑶Binfo的信息写入⑶Binfo表4109中由所弹出的指针指向的空存取位置中。当完成 CDBinfo的处理时,擦除该CDBinfo,并且,指向CDBinfo表4109中包含该CDBinfo的存取 位置的指针被加入空闲列表4102,由此释放空间,以便其被用于新⑶B。SCSI协议需要SSD控制器106甚至在资源不可用的情况中也保证在特殊环境下处 理⑶B的能力。下文联系图46和图47详细描述这些影响控制空闲列表4102的方式的需 求。共享RAM块318包含两个涉及IOP的数据结构Ι0Ρ表4110和IOP空闲列表4103。 它们与对应的⑶Binfo结构类似地操作。IOP表4110对于SSD控制器106 —次可以处理 的60个IOP中的每个包含一个存取位置。联系图38描述包含在IOP表4110的每个存取 位置中的IOP信息的格式。IOP空闲列表4103是包含指向IOP表4110中空闲(未填充有 效Ι0Ρ)的存取位置的指针的深度60的FIFO队列。共享RAM块318包含两个涉及传输请求的数据结构传输请求表4111和传输请 求空闲列表4104。它们与对应的IOP结构类似地操作。传输请求表4111对于SSD控制器 106 —次可以处理的120个传输请求中的每个包含一个存取位置。联系图39描述该信息的 格式。传输请求空闲列表4104是包含指向传输请求表4111中空闲的存取位置(未填充有 效传输请求)的指针的深度120的FIFO队列。共享RAM块318还对于包含在SSD控制器106中的每个HEMi包含一个工作列表。 虽然所描述的实施例包括23个HEMi,其中每个在共享RAM块318中都具有关联的工作列 表,但图41仅示出了它们中的三个4105、4106和4107。应该理解,HEMi的数量在实施之 间变化,并且共享RAM块318将始终对于每个HEMi包含一个工作列表。每个HEMi工作列表是要被关联的HEMi操作的任务的队列。一般地,HEMi工作列 表包含指向CDBInfo表4109中的CDBinfo、IOP表4110中的IOP以及传输请求表4111中 的传输请求的指针,并且HEMi工作表上这样的指针的出现指示关联的HEMi被要求执行涉 及所识别的⑶Binfo、I0P或传输请求的处理任务。HEMi通过在HEMi工作列表上放置指针 而互相通信。在当前的实施例中,工作列表是FIFO,并且被FIFO指针寄存器控制,指针寄存器 如联系图24所描述(例如,指针寄存器2205)。任务以被接收的顺序从工作列表中弹出,而 不试图对特定任务赋予优先级。在替代实施例中,通过例如在IOP中包括优先级位而对任 务赋予优先级。由设置有优先级位的IOP调用的传输请求也可包括优先级位。这样的高优 先级传输请求可以被加入到HEMi工作列表的顶部,而不是附加到底部,从而,这样的传输 请求变成下一个由HEMi处理的传输请求,即使其它传输请求已经在列表上。一旦⑶Binfo、IOP或传输请求被移动到HEMi工作列表,没有其它的HEMi能够修 改该结构(除了中止相关的信息)。共享RAM块318还包括全局变量4113。它们存储由处理中的HEMi使用的变量。图42图示启动器表4108中的条目的结构。每个这样的条目(例如,启动器04101)包含启动器自指针字段(4201),其指向表4108中的启动器的位置。启动器标识符字段4202包含识别该特定启动器的信息。从主机接收该信息,并且 其被用在主机与SSD控制器106之间的通信中,从而主机可以从SSD控制器106向合适的 启动器路由通信。通过从主机接收第一个指示新启动器已经请求访问SSD控制器106的请 求的接收HEMi填充启动器标识符字段4202 (这种请求的格式对特定协议是特定的,例如, SAS、FCAL等,并且本领域的普通技术人员理解这一点)。当接收到这样的指示时,接收HEMi 使启动器从启动器空闲列表4112中弹出,并利用从主机接收的识别信息填充启动器标识 符字段。在当前优选实施例中,启动器标识符包括作为启动器的开放帧接收的全球名称。计数字段4203包含从还未完成的启动器接收的⑶B的数量。当接收到⑶B时,接 收HEMi识别启动器,并为该启动器递增计数字段4203。当IOP完成执行时,作为清理处理 的一部分,计数字段4203递增。当计数字段4203到达0时,其指示该启动器在系统中没有剩下的命令。此时,在 一个实施例中,启动器信息被擦除,并且数据结构被返回到启动器空闲列表4112。在替代实 施例中,仅当空闲列表是空的并需要新启动器时,启动器才被返回到空闲列表。突发包长度字段4204包含当启动器最初被设立时从主机作为元数据的一部分接 收的突发包长度控制信息。由SCSI协议指定的突发包长度控制信息被用于设置突发包数 据传输的最大长度。如果向或从启动器的传输超过该最大长度,则SSD控制器106必须中 断该传输,允许向或从其它启动器的传输发生,并且接着恢复该传输。这由正处理该传输的 传送HEMi处理。在达到该限制之后,传送HEMi断开传输,并接着立即设法重新连接。V.操作A.写性能对于高容量固态驱动器,主要性能瓶颈是与闪存的接口。因此设计SSD控制器106 来最大化该接口的使用。通过将事务分解为相对较小的组块(chunk),并以高度并行性执行 这些组块,意在保持闪存接口尽量忙碌来这么做。因此,闪存模块108包含大量闪存组,每 个组具有与系统的其余部分的独立接口,以及允许每个闪存组独立而并行地操作的关联闪 存端口。在每个闪存组内,存储器被分解为子组,每个子组可以并行地操作。虽然每个闪存 组一次仅有一个子组可以与SSD控制器106通信,但小事务部分被输入到多个子组,允许子 组在闪存接口被用于其它目的同时执行内部闪存操作。这连同多个缓冲器的使用允许事务 比在读或写必须串行发生的情况中所可能的速度快得多地完成。以40MHz工作的典型的同时代单层单元闪存芯片执行一个页面的写操作花费大 概200微秒(本领域的技术人员应该理解,闪存写操作经常包括读-修改-写)。此外,将 一超级页面的数据从级缓冲器移动到闪存芯片缓冲器中花费约50微秒。这意味着闪存组 可以使对不同的子组的五个连续的写操作流水线化,并由此保持闪存接口被完全占用每 个写操作需要总线50微秒,并接着内部操作200微秒,在这期间,四个其它的写操作可以使 用该总线。因此,数据可以在500微秒内被写入90个LBA的完整分条中。这在图43中图示,其包含交叉引用一个闪存组的子组0-7与以50微秒为递增的 时间的表。该表示出了对子组0-5 (包括90个LBA)上的超级页面的六超级页面的写。在第一个50微秒时间段中,子组0使用总线将一超级页面的数据从级缓冲器移动 到子组0的闪存页面缓冲器。这在图43中被示为“M”。在接下来的四个50微秒时间段中,子组0上的闪存电路小片执行从它们的页面缓冲器到闪存的内部写操作(在图43中被示 为 “W,,)。因为在初始时间段之后子组0不需要总线,所以,在第二个50微秒时间段(标记 为时间100)期间,子组1能够从级缓冲器向子组1的页面缓冲器移动数据。然后,子组1 可以开始内部闪存写操作,将总线移交给子组2。对子组3、4和5的写类似地进行。可以看出,该六超级页面的写花费500微秒。闪存总线在该时间段中的300微秒 期间处于使用状态。因为闪存写操作可以与总线操作并行地发生,所以,在约三分之一的时 间中完成了在串行情况下将花费1500微秒(6X250)的写。此外,在300微秒之后,闪存总线是空闲的,因此允许其它事务获得对总线的访 问,并因此允许多个事务重叠。图43示出了写操作,因为包含在这样的操作中的等待时间比读操作大得多,其中 读操作花费约100微秒(50微秒用于将数据读取到闪存页面缓冲器,50微秒用于将数据移 动到级缓冲器),所以,所描述的结构被设计来最大化写的性能,尽管其也倾向提高读的性 能,但程度较低,其中假定在相同的闪存组上仅可以重叠两个读操作(一个从闪存读,一个 将数据移动到级缓冲器)。因为相同程度的性能并行地发生在每个闪存端口上,而且因为数据横跨闪存 组被分条,所以,与没有使用该并行流水线化结构所可能的情形相比,大事务可以迅速 得多发生。因此,理论上,包含12个闪存组的系统可以在500毫秒时间段中写1080个 LBA(12X90)。在真实世界中通常不可能获得该理论最大值,这是因为其需要每个写以子组 和闪存组的形式完美地排队。但是,应该很显然,所描述的结构的并行性和流水线化掩盖 了闪存引入的等待时间,并允许以比传统硬盘驱动器或闪存设备高得多的性能处理读写序 列。因为所描述的结构包括可观的超过合并了标准SLC闪存芯片的系统所必需的性 能净空(headroom),所以其可以在没有大修改的情况下适用于较低速的MLC闪存。如在本 领域中所理解的,MLC( “多级单元”)每个闪存单元存储两个(或更多个)比特。因此,对 于给定的存储量,MLC芯片更便宜。然而,MLC芯片在读和写上更慢。图44示出了在单个由MLC闪存芯片构成的闪存组上的90个LBA的写,该MLC闪 存芯片需要350微秒用于一个页面的写(当前市场上的MLC芯片的典型性能)。可以看出, 在600微秒内完成整个写。虽然这超过了图43中所示的用于SLC器件的500微秒,但是, 尽管MLC芯片为每个写都花费额外的100微秒,而对于六个完整页面的写,差别也仅有100 微秒。如上文,可以横跨多个闪存组并行地完成该写。该并行性足够很大程度地掩盖MLC 芯片的额外等待时间,从而,无论使用SLC还是MLC芯片,对于主机,系统跨越主机接口的响 应度都将完全可接受。B.读和写处理图45包含图示当接收到主机发起的写命令时主机端口(例如,主机端口 0104)遵 循的步骤的流程图。该流程图假定所接收的初始帧是写,并在该基础上进行。为此原因, 未示出实际实施中所需要的大量步骤(例如,确定所接收的命令是读还是写,并相应地分 支)。在步骤4501中,GigaBlaze 1801接收来自主机的基元。
在步骤4502中,GigaBlaze 1801将基元发送到基元匹配逻辑1802。在步骤4503中,基元匹配逻辑将基元识别为帧开始(“S0F”)基元,指示其后跟随 着帧(应该理解,该描述本质上是概念性的,并不意在描述所接收的基元的特定性质。还应 该理解,通信的性质一定程度上取决于特定协议,并且该处理的细节根据所使用的协议而 不同)。在步骤4504中,在对应于来自基元匹配寄存器1902的与所接收的基元匹配的寄 存器的来自基元匹配控制寄存器1903的寄存器的控制下,帧破解逻辑1904评估帧的第一 个双字。在步骤4505中,帧破解逻辑确定帧是命令帧。在步骤4506中,在基元匹配逻辑1802的控制下操作的帧路由器1803将帧路由到 非数据有效载荷FIFO 1804。这在基元匹配控制寄存器和帧破解逻辑的控制下完成。在步骤4507中,用于主机端口的接收HEMi (例如,接收HEMi 1702)使命令帧从头 部FIFO中弹出。在步骤4508中,接收HEMi评估帧并确定其包含⑶B。在步骤4509中,作为确定帧包含⑶B的结果,接收HEMi产生⑶Binfo。在步骤4510 中,接收 HEMi 将 CDBinfo 发送到 SCSI HEMi 2001。在步骤4511中,SCSI HEMi 2001确定CDB包含写命令。在步骤4512中,基于CDB包含写命令的确定,SCSI HEMi 2001将CDBinfo发送到 Rdffr HEMi。在步骤4513 中,基于 CDBinfo,Rdffr HEMi 产生 Ι0Ρ。在步骤4514中,Rdffr HEMi将IOP发送到传送HEMi (例如,1704)。在步骤4515中,传送HEMi产生传输准备好的帧,其被设计来向主机指示SSD控制 器106现在准备好接收包含要被写的数据的数据帧。在步骤4516中,传送HEMi将传输准备好的帧发送到GigaBlaze 1801。在步骤4517中,GigaBlaze将传输准备好的帧发送到主机。在步骤4518中,GigaBlaze接收由主机发送的响应于传输准备好的帧的基元,其 用信号发送第一个数据帧的开始。在步骤4519中,GigaBlaze 1801将基元发送到基元匹配逻辑1802。在步骤4520中,基元匹配寄存器匹配该基元作为S0F。在步骤4521中,在基元匹配控制寄存器1903的控制下,帧破解逻辑1904评估帧
的第一个双字。在步骤4522中,帧破解逻辑确定该帧是数据帧。在步骤4523中,在基元匹配逻辑1802控制下操作的帧路由器1803将帧的头部部 分路由到非数据有效载荷FIFO 1804,并将帧的数据部分路由到接收级缓冲器1706。这由 于基元匹配控制寄存器中的基元的匹配以及帧被识别为数据帧而完成。在该情况中,基元 匹配控制寄存器引起路由逻辑将设置数量的双字路由到非数据有效载荷FIFO,并接着将后 续双字路由到级缓冲器。在步骤4524中,接收HEMi使头部从非数据有效载荷FIFO中弹出。在步骤4525中,接收HEMi评估头部并确定其表示数据帧。
在步骤4526中,接收HEMi检查头部的目标端口传输标签(“TPTT”)部分。与所 有帧一起接收的该字段包含将与单个事务关联的帧连接在一起的数据,例如,包含写命令 的命令帧与包含要写入的数据的数据帧。TPTT信息被复制到作为传入的命令的结果而创建 的IOP中。接收HEMi使用该信息将接收的数据帧与在步骤4513中创建的IOP关联。在步骤4527中,接收HEMi设立包含在接收级缓冲器中的数据到数据路径DRAM 107中由IOP指定的位置的DMA传输。下文描述写操作随后进行的方式。图46包含图示SSD控制器106处理⑶B的最初阶段的流程图。该流程示从 从主机接收CDB —直到将CDBinfo传递到RdWr HEMi的处理。应该理解,并且对于在这里使用的所有流程图来说都正确的,图46从算法的角度 图示了该处理,而不意在描述实现细节,也不意在描述具体的软件步骤。此外,某些步骤的 排序是任意的,因为在后的步骤不依赖于在先的步骤的结果。实际实施例中排序这种步骤 的方式是实施相关的。在步骤4601中,主机101通过物理接口 1701将⑶B传送到接收HEMi 1702。如上 所述,CDB由包括启动器的标识的元数据伴随。接收HEMi 1702在它的mRAM中临时存储CDB 和元数据。在步骤4602中,接收HEMi 1702通过交叉切换器2201访问共享RAM快318,并且 检查⑶Binfo空闲列表4102,以确定是否超过16个⑶Binfo可用。如果16或更少个可用(步骤4602的“否”结果),则处理进行到图47所示的流程 图,其涉及特殊情形的处理,联系该图更详细地讨论所述处理。如果超过16个CDBinfo可用(步骤4602的“是”结果),则在步骤4603中,接收 HEMi 1702通过交叉切换器2201访问共享RAM块318,并检查启动器表4108,以查看在元数 据中识别的启动器是否已经存在。注意,该步骤还可以作为图47所示的流程图的结果之一 而被到达。如果启动器不在启动器表4108中(步骤4603的“否”结果),则在步骤4604中, 接收HEMi 1702检查启动器空闲列表4112,以确定是否有空闲启动器可用。如果没有空闲启动器可用(步骤4604的“否”结果),则在步骤4605中,接收HEMi 1702调用队列满例程。在当前的优选实施例中,SSD控制器106处理该情况的方式取决于 用户在初始化时可设置的参数。用户可以决定在该情况中进行队列满报告,其具有引起启 动器重试命令直到资源可用的效果。可选地,用户可以决定要求启动器表4108的“清除 (scrub) ”,以确定该表是否包含任何具有0的计数字段4203的启动器,具有0的计数字段 4203的启动器意味着它们没有有效的命令。可以从表中清除这种启动器,由此释放用于新 启动器的空间。如果清除打开一启动器,则处理可以继续。否则,进行队列满报告。如果有空闲启动器可用(步骤4604的“是”结果),则在步骤4606中,接收HEMi 1702使启动器从启动器空闲列表4112中弹出。在步骤4607中,接收HEMi 1702使用在伴随该⑶B的元数据中接收的识别信息填 充启动器标识符字段4202。在步骤4608中,接收HEMi 1702为该启动器将计数字段4203加上1。无论启动器 是(步骤4603的“是”结果)否(来自步骤4607)已经存在在启动器表4108中,都执行该步骤。
59
在步骤4609 中,接收 HEMi 1702 使顶部 CDBinfo (例如,CDBinfo 201)从 CDBinfo 空闲列表4102中弹出。在步骤4610中,接收HEMi 1702将CDBinfo从CDBInfo表4109复制到其自己的 mRAM中。注意,此时,⑶Binfο除自指针字段3701外是空的。在步骤4611中,接收HEMi 1702如下填充⑶Binfo的字段在⑶B字段3702中,其放置从主机101接收的⑶B的副本。在启动器字段3703中,其放置来自启动器表4108中用于该启动器的条目的自指 针4201的副本。在SCSI标签字段3705、SCSI标签字段3706、参考标签字段3708以及应用标签字 段3709中,其放置在包括该⑶B的传送中从主机101中接收的元数据。联系图37描述该 元数据的性质。在突发包长度控制字段3707中,其放置包含在与在启动器字段3703中识别的启 动器关联的启动器信息的突发包长度控制字段4204中的信息的副本。在步骤4612中,接收HEMi 1702访问交叉切换器2201,并将填充的CDBinfo 201 复制到⑶Binfo表4109中被自指针字段3701指向的存取位置。在步骤4613中,接收HEMi 1702在用于SCSI HEMi 2001的工作列表中放置自指 针字段3701的副本。如果用于SCSI HEMi 2001的工作列表先前是空的,则将指针置于该工作列表中会 唤醒SCSI HEMi0如果其它任务已经存在在工作列表上,则SCSI HEMi完成这些任务。在任 一情况下,在某些点上,指向⑶Binfo 201的指针在工作列表的顶部,并且,在步骤4614中, SCSI HEMi 2001使用交叉切换器2201访问其工作列表,并使该指针弹出。在步骤4615中,SCSI HEMi 2001使用交叉切换器2201访问CDBinfo表4109中 的⑶Binfο 201的位置,并且将该⑶Binfο复制到其自身的mRAM中。在步骤4616 中,SCSI HEMi 2001 从 CDBinfo 201 的 CDB 字段 3702 中读取 CDB 的 命令部分,以确定其是否是数据传输(读或写)。如果命令不是读或写(步骤4616的“否”结果),则在步骤4617中,SCSIHEMi 2001 将⑶Binfo传递到ARM处理器2002,其负责处理除读或写之外的命令。此时,图46中所述 的处理结束。如果命令是读或写(步骤4616的“是”结果),则在步骤4618中,SCSI HEMi2001 将存储在⑶Binfo 201的⑶B字段3702中的⑶B的LBA和传输长度字段与命令表2003比 较,如上所述,命令列表2003被存储在SCSI HEMi 2001的mRAM中。通过该比较,SCSI HEMi 2001确定在命令表中是否已识别任一需要被⑶B传输的LBA。匹配意味着新⑶B的主题的 某些或全部LBA已经是现有传输的主题。如上所述,需要SSD控制器106保持一致性,从而 LBA不经受不一致的命令。如果SCSI HEMi 2001发现命令列表匹配(步骤4618的“是”结果),则在步骤4619 中,其停止⑶Binfo的执行并返回到步骤4618。该循环继续直到匹配不再存在。如果未发现匹配(步骤4618的“否”结果),则在步骤4620中,SCSI HEMi2001将 LBA和传输长度从⑶B字段3702放置到命令列表2003中。在步骤4621中,SCSI HEMi 2001为每个RdWr HEMi工作列表访问计数寄存器(例如,计数寄存器2408),以确定这些工作列表中的哪个包含最少的任务。在步骤4622中,SCSI HEMi 2001将指向CDBinfo 201的指针放置在识别的工作 列表上,例如用于RdWr HEMi 2101的工作列表,并且图46所描述的处理完成。注意,步骤4602之后步骤4609之前的启动器相关的步骤仅对于允许超过一个启 动器的协议(例如,SAS和光纤信道)是必要的。对于仅允许单个启动器的协议(例如, SATA),这些步骤不必要。替代地,对于基于SATA的系统,当接收到最初的设置特征命令时, 控制器106设立启动器。如本领域中所理解,设置特征命令包括需要用于突发包长度字段 4204的突发包长度信息。在设立了启动器之后,⑶B的处理如图46中所示地进行,然而,应 该理解,对步骤4603的回答总是“是”,并且处理进行到步骤4608 (其不必要但也无害)然 后进入步骤4609。这允许对SATA、SAS以及光纤信道使用公共的代码库(code base)。在替代实施例中,略有不同的代码库被用于SATA系统,该系统完全没有启动器。 在这样的实施例中,图46的处理将跳过步骤4602至步骤4609。在再一实施例中,基于使用 的协议设置变量,并且在该变量识别SATA协议的情况下,处理跳过步骤4602至步骤4609。如上所述,当接收到⑶B时,如果⑶Binfo空闲列表4102上16个或更少的⑶Binfo 可用,则调用特殊的处理例程。两个特殊情形必须被检查和处理(如果它们存在)。首先,SCSI协议需要SSD控制器105确保最后一个⑶B可以在SSD控制器106已 经报告了缺乏资源之后被处理。尽管该协议需要控制器正确地响应这些情况下发出的任何 CDB,但该能力通常意在允许主机发出要求关于错误情形的信息的请求探测CDB,第二个特殊情况出现在客户要求强制SSD控制器106能够同时支持十六个有效的 启动器的情况下,意味着其必须能够为每个可能的启动器(最多16个)支持至少一个有效 的 CDB。该客户要求意味着在少于16个当前有效的启动器的情况下,SSD控制器106必 须维持足够的CDBinfo来保留,来为每个可以变为有效的额外启动器(最多16个)分配一 个CDBinfo。注意,该特征是实施相关的,这是因为某些客户可能不需要它。在一个实施例 中,通过在初始化时设置的变量来使能该特征。在另一实施例中,略有不同的代码库被用于 需要以及不需要该特征的系统。在一个实施例中,可以如图47中所示处理这些特殊情况的两者。注意,在图46中 的步骤4602的“否”结果之后,由接收HEMi执行这些步骤。在步骤4701中,检查CDBinfo空闲列表4102,以确定是否有任何空闲CDBinfo。如果没有空闲⑶Binfo存在(步骤4701的“否”结果),则处理进行到步骤4702, 其调用队列满例程。虽然细节取决于使用的协议,但一般这包括向主机返回队列满消息。如果有空闲CDBinfo (步骤4701的“是”结果),则在步骤4703中,检查空闲列表 4102,以确定空闲列表上是否仅有单个空闲⑶Binfo。如果空闲列表上仅有一个⑶Binfο (步骤4703的“是”结果),则在步骤4704中, 检查保留标志。在初始化时该标志被设为“0”,并且在向空闲列表4102中加入CDBinfo的 任何时候也将其设为“0”。保留标志指示当前CDB是否有权使用空闲列表中的最后一个 CDBinfo0如上所述,SCSI协议需要在队列满被返回之后接受一个额外的CDB,意味着如果 仅有一个⑶Binfo剩余在空闲列表上,则第一⑶B必须触发队列满指示,并且允许第二⑶B 使用 CDBinfo。
如果保留标志未被设置(步骤4704的“否”结果),则在步骤4705中,设置保留标 志。然后,处理继续到步骤4702,其指示队列满例程。如果保留标志被设置(步骤4704的“是”结果),则在步骤4706中,处理返回到图 46的步骤4603,其后,保留的CDBinfo将被分配给CDB。如果空闲列表4102上的空闲⑶Binfo的数量大于1 (步骤4703的“否”输出),则 处理进行到步骤4707,其中负责该CDB的启动器的计数字段4203被评估,以确定该启动器 是否已经具有至少一个当前的⑶B (计数字段彡1)。如果启动器不具有任何有效的CDB(或者如果其为新启动器)(步骤4707的“否” 结果),则处理进行到步骤4706,并且从那里进行到图46的步骤4603,其后,⑶Binfo将为 该启动器弹出,这是因为,系统允许启动器被保证至少一个有效的CDB。如果启动器已经具有有效的⑶B (步骤4707的“是”结果),则不需要系统向启动 器保证⑶B,并且处理进行到步骤4708,在其中,启动器表4108中具有至少为1的值的计数 字段4203的条目的数量被放置在称为“Varl”的变量中。该数量表示当前有效的启动器的 数量,每个启动器至少具有一个有效的命令。在步骤4709中,从16减去Varl,并且将结果置于称为“Var2”的变量中。其表示 必须被保证⑶Binfo的额外启动器的数量。在步骤4710中,将空闲列表4102 中条目的数量与Var2比较。如果空闲⑶Binfo 的数量比Var至少大2 (步骤4720的“是”结果),则处理进行到步骤4706,并且从那里进 行到图46的步骤4603,其后,将⑶Binfo弹出,这是因为,有足够的⑶Binfo可用于满足该 保证。如果空闲CDBinfo的数量并非比Var2至少大2 (步骤4710的“否”结果),则在 步骤4702中,系统报告队列满。这是必须的,因为必须保持足够的空闲⑶Binfo,以允许由 Var2表示的数量的启动器的未来维护,加上一个必须维持保留的额外CDBinfo。因此,图47所示的流程图检查上述的两个特殊情况。图48包含图示基于⑶Binfo设立IOP和传输请求的方式的流程图。在步骤4801中,RdWr HEMi (例如,RdWr HEMi 2101)使用交叉切换器2201来访问 其工作列表,并使指向⑶Binfo (例如,⑶Binfo 201)的指针弹出。在步骤4802中,RdWr HEMi 2101使用交叉切换器2201访问CDBinfo表4109中 的对应于所述指针的位置,并在该位置找到⑶Binfo 201。RdWr HEMi 2101将⑶Binfo 201 复制到它的mRAM中。在步骤4803中,RdWr HEMi 2101确定在IOP空闲列表4103上是否存在任何Ι0Ρ。如果在空闲列表上不存在IOP (步骤4803的“否”结果),则在步骤4804中,RdWr HEMi 2101等待IOP以完成执行,然后,一旦空闲IOP出现在空闲列表上,重新开始处理。如果在空闲列表上存在IOP(步骤4803的“是”结果),则在步骤4805中,Rdffr HEMi 2101使用交叉切换器2201访问共享RAM,并确定传输请求空闲列表4104上是否存在 足够的传输请求用于处理IOP所需要数量的传输请求。如果空闲列表上存在不足的传输请求(步骤4805的“否”结果),则在步骤4806 中,RdWr HEMi 2101等待传输请求释放,然后进行到步骤4807。如果空闲列表上存在传输请求(步骤4805的“是”结果),则在步骤4807中,RdWrHEMi 2101使顶部IOP指针从空闲列表中弹出。该指针被复制到⑶Binfo的IOP字段3704中。在步骤4808中,RdWr HEMi 2101将空闲列表上的顶部指针指向的IOP (例如,IOP 202)从IOP表4110复制到它的mRAM中。此时,包含在IOP中的仅有信息是自指针3801。在步骤4809中,Rdffr HEMi 2101将来自⑶B字段3702的传输长度值从⑶Binfo 复制到名为“TLvar”的变量中。该变量贯穿所描述的算法的剩余部分存储当前传输长度 (应该理解,在这个或其它情况中,该描述本质上是概念性的,并且实际实施可以包括也可 以不包括带有该名称的变量)。在步骤4810 中,RdWr HEMi 2101 将来自 CDB 字段 3702 的 LBA 值从 CDBinfo 复 制到称为“LBAvar”的值中。该变量贯穿所描述的算法的剩余部分存储当前传输开始处的 LBA。在步骤4811 中,RdWr HEMi 2101 如下填充 IOP 202 在调用HEMi字段3802中,其放置其自身的指针。在⑶Binfo字段3805中,其放置早先从其工作列表弹出的⑶Binfo指针。在启动器字段3804中,其放置从⑶Binfo 201的启动器字段3703中取出的启动 器指针。其设置状态变量字段3810,以指示IOP的当前状态。其清零中止标志3811。在参考标志字段3812和应用标志字段3813中,其复制⑶Binfo 201的参考标签 字段3708和应用标签字段3709的内容。在步骤4812中,Rdffr HEMi 2101使顶端传输请求指针从空闲列表中弹出。在步骤4813中,RdWr HEMi 2101将由空闲列表上的顶部指针指向的传输请求从 传输请求表4111复制到它的mRAM中。此时,包含在传输请求中的仅有信息是自指针3901。在步骤4814中,RdWr HEMi 2101递增IOP已分配传输请求字段3807,以反映新传 输请求。在步骤4815中,RdWr HEMi 2101递增IOP剩余传输请求字段3808,以反映信息传
输请求。在步骤4816中,RdWr HEMi 2101将传输请求自指针3901复制到IOP传输请求指 针阵列3809中。在步骤4817中,RdWr HEMi 2101将来自LBAvar的值复制到传输请求LBA字段 3903中。这是将被传输请求用于传输的开始的位置。在步骤4818中,Rdffr HEMi 2101利用通过从IOP传输长度中减去TLvar并将该 结果加到指向IOP数据缓冲器3202中专用于该IOP的空间的指针上而计算的值填充传输 请求DRAM指针字段3905。该结果指示涉及该传输请求的数据将存储在IOP的DRAM空间中 的哪里。该值将为每个后继的传输请求增加等于由紧挨在前的传输请求处理的传输的大小的量。在步骤4819中,Rdffr HEMi 2101如下填充某些传输请求字段在调用IOP字段3902中,其放置指向从IOP空闲列表4103中弹出的IOP的指针。在LBA字段3903中,其放置当前在LBAvar中的值的副本,指示用于该传输的起始
63LBA。清除中止标志3906。在命令字段3907中,其放置所要求的命令的类型。在该示例中,该命令是读。利用从IOP 202的字段3812和3813中取得的信息,来填充参考标签字段3909和 参考标签字段3910。在步骤4820中,RdWr HEMi将传输请求LBA值除以15,并将商放置到名为“索引”
的变量中。在步骤4821中,RdWr HEMi使用索引在转发表3201中执行查找。该查找产生对 应于包含在传输请求LBA字段中识别的LBA的超级页面的行。来自该行的端口字段被放置 到名为“端口 A”的变量中。在步骤4822中,TLVar中的值被复制到名为“TLTemp”的变量中。在步骤4823中,名为“页面”的变量被初始化为值1。如上所述,每个传输请求可 以处理最多三个超级页面,每个超级页面可以处理15个LBA的块。该变量追踪分配到该传 输请求的这种LBA块的数量。在步骤4824中,从15减去来自在步骤4820中执行的除法的余数,并将结果放置 在名为“偏移”的变量中。如上所述,每个超级页面包含15个LBA,并且,传输中的第一个 LBA可以被偏移到操作页面的中间。还如上所述,每个传输请求可以发起三个页面请求,每 个页面请求可以处理单个超级页面。结果,如果第一个LBA被偏移到超级页面中,则由传输 请求发出的页面请求中的一个将处理少于十五个LBA。步骤4824处理该情况。在步骤4825中,将偏移中的值与TLTemp中的值比较。如果Offset比TLTemp大或相等(步骤4825的“是”结果),则这意味着传输将在 可以由该传输请求处理的LBA范围中完成。在步骤4826中,TLTemp中的值被写入传输请求传输长度字段3904中。在步骤4827中,将传输请求放置在用于负责在端口 A变量中识别的端口的闪存 HEMi的工作列表上。因为用于该IOP所必需的所有传输请求都已经被分配,所以接着处理结束。如果TLTemp比偏移大(步骤4825的“否”结果),则在步骤4828中,评估TLTemp, 以确定其是否小于或等于15。如果TLTemp小于或等于15 (步骤4828的“是”结果),则其意味着传输将以该传 输请求完成,并且,处理继续到步骤4826,其如上所述进行。如果TLTemp大于15 (步骤4828的“否”结果),则在步骤4829中,从TLTemp中减 去偏移,并且将结果存回到TLTemp中。该步骤重复地递减TLTemp,以反映要被分配给当前 正在设立的传输请求的LBA。然后,使用该值计算传输请求传输长度字段。在步骤4830中,变量索引中的值被递增。在步骤4831中,基于新索引值执行转发表查找。应该理解,这产生在由在前的查 找提供的行之后的行,并因此产生下一个15个LBA的块。来自该行的端口值被写入名为 “端口 B”的变量。其表示存储下一 LBA块的超级页面。在步骤4832中,比较端口 A和端口 B。如果它们相同(,步骤4832的“是”结果), 则其意味着包含所述15个LBA的下一块的超级页面与在前的超级页面存储在相同的闪存组中。这意味着当前传输请求理论上可以处理下一 LBA块。在步骤4833中,将页面变量与3比较。如果页面变量小于3 (步骤4833的“否”结 果),则其意味着传输请求可以处理额外的15个LBA的块,因此,处理进行,以设立穿过传 输请求循环的下一反复(iteration)。在步骤4834中,递增页面变量,以反映在下一循环中新LBA块将被分配到传输请 求的事实。在步骤4835中,将值15写入到偏移变量中。因为用于下两个超级页面的LBA范 围将在15的偶数倍处开始,所以对于任何在第一个超级页面后的超级页面不需要偏移。为 了在步骤4825中的计算的目的,以及为了在步骤4829中递减TLTemp的目的,通过将偏移 设为15来处理其。然后,处理循环到步骤4825,并为下一 LBA块而进行。如果端口 B中的值与端口 A中的值不同(步骤4832的“否”结果),则其意味着 下一 LBA块处于与分配给传输请求的在前块不同的端口上。因为传输请求仅可以操作一个 闪存组上的LBA,因此当前传输请求此时必须结束。类似地,如果页面变量等于3 (步骤4833 的“是”结果),则传输请求也必须结束,这是因为,这意味着传输请求已经被分配了相当三 个超级页面的LBA。在任一情况中,处理进行到步骤4836,其中,从TLVar减去TLTemp,并且将结果存 储在传输请求传输长度字段3904中,该结果包含分配给传输请求的LBA的数量。在步骤4837中,传输请求被添附到用于分配给与端口 A变量中识别的端口关联的 闪存组的闪存HEMi的工作列表中。在步骤4838中,将TLTemp的值存储在TLVar中。这设立TLVar用于在产生下一 传输请求中使用。在步骤4839中,将LBAVar加到传输请求传输长度字段中的值上,并且将结果存回 到LBAVar中。这设立LBAVar用于在产生下一传输请求中使用。在步骤4840中,Rdffr HEMi分析IOP已分配传输请求字段3807,以查看其是否等 于 “7”。如果已经分配了七个传输请求(步骤4840的“是”结果),则IOP不能分配任何其 它传输请求。如上所述,通过允许IOP完成并接着重新发出带有由于IOP的在前执行而修 改的LBA和传输长度值的IOP来处理该情况。因此,在步骤4841中,完成了 IOP的第一次 反复,此时,处理循环到步骤4811,其中,为IOP的下一执行填充IOP字段。如果已经分配的传输请求少于七个(步骤4840的“否”结果),则处理循环回到步 骤4812,并且开始发出下一传输请求的处理。注意,新传输请求将获得已被基于紧挨在前的 传输请求调整的LBA和传输长度值。图49图示闪存HEMi (例如,闪存HEMi 307)基于在闪存HEMi的工作列表上存在 的传输请求设立用于读或写操作的页面请求的方式。在步骤4901中,闪存HEMi 307检查它的局部传输请求空闲列表2905,以确定局部 传输请求表2901是否包含至少一个空闲存取位置。如果否(步骤4901的“否”结果),则在步骤4902中,闪存HEMi 307等待,并接着 返回到步骤4901。该等待可以是指定的时间段,也可以直到其它任务已经完成执行为止。一旦存在空闲的局部传输请求可用(步骤4901的“是”结果),则在步骤4903中,
65闪存HEMi 307使用交叉切换器2201访问它的工作列表,并将该传输请求从工作列表中弹
出ο在步骤4904中,闪存HEMi 307使指向下一空闲局部传输请求的指针从局部传输 请求空闲列表2905中弹出。在步骤4905中,闪存HEMi 307使用交叉切换器2201访问共享RAM块318中的传 输请求表4111,并且将由工作列表指向的传输请求从表4111复制到来自局部传输请求表 2901的由从局部传输请求空闲列表2905中弹出的指针指向的存取位置中。在步骤4906中,来自传输请求LBA字段3903的值被复制到被称为LBAvar的变量中。在步骤4907中,来自传输请求传输长度字段3904的值被复制到被称为TLvar的
变量中。 在步骤4908中,来自传输请求数据路径DRAM指针字段3905的值被复制到被称为 DPvar的变量中。在步骤4909中,闪存HEMi使页面请求从它的页面请求空闲列表2910中弹出。注 意,不需要检查来确定是否存在空闲的页面请求,这是因为,闪存HEMi 307的mRAM包含 十八个页面请求,其是可以被闪存HEMi 307 —次可以处理的六个局部传输请求要求的最大值。在步骤4910中,将LBAvar的值除以15。在步骤4911中,来自步骤4910的结果被用作进入转发表3201的偏移。该查找产 生闪存中用于LBA的位置的子组、块和页面的地址信息。注意,来自转发表的端口信息不必 要,这是因为,该信息被用在图48的流程图中,以将传输请求发送到所述闪存HEMi,该闪存 HEMi仅控制单个端口。在步骤4912中,将来自转发表的查找的子组、块和页面地址信息存储在页面请 求闪存读地址字段4006中。注意,需要读地址用于写到少于一个完整页面的写操作,因 为这种写操作需要读-修改-写。在带有传输长度15的页面请求写的情况中,跳过步骤 4910-4913,该情况指示要写入完整页面。在步骤4913中,来自步骤4910的余数被复制到头长度字段4008中。如果存在, 其表示基于超级页面的偏移,在该点处开始传输。在步骤4914中,来自DPvar的值被复制到数据路径DRAM指针字段4004。其指示 数据路径DRAM 107中页面请求要读取数据的位置,或者页面请求要写入数据的位置。在步骤4915中,基于传输请求,填充其它页面请求字段。联系图40如上描述这些 字段。如下填充这些字段利用指向调用局部传输请求的指针(从局部传输请求空闲列表2905弹出的值) 填充调用传输请求字段4002。基于传输请求的命令字段3907填充命令字段4003。在传输请求写的情况中,如果 该写覆盖超级页面的完整的15个LBA (传输长度=15)则利用平常的(plain)写来填充命 令字段,或者,如果该写覆盖少于一个完整超级页面,则利用读_修改_写来填充命令字段。如果命令字段4003识别该事务为写或读_修改_写,则利用要被写的超级页面的 物理地址来填充闪存写地址字段4007。联系图54描述识别该超级页面的方式。
状态变量字段4011也在步骤4915中被初始化。在步骤4916中,将TLvar与值“15”比较。如果TLvar小于或等于15 (步骤4916的“是”结果),则其意味着当前的页面请求 表示传输请求所需要的最后一个页面请求。在步骤4917中,尾长度字段4009被设为15-(TLVar+头长度)。其表示超级页面 末端不包括LBA的部分传输。注意,对于传输请求中除最后一个页面请求外的所有页面请 求,将尾长度字段设为0。在步骤4918中,将传输长度字段4010设为TLvar。在步骤4919中,将指向页面请求的指针放置在传输请求的页面请求指针阵列 3913 上。在步骤4920中,来自页面请求指针阵列3913的每个指针被复制到子组队列2911 中对应于在步骤4911中的查找中获得的子组的队列上。在步骤4921中,为调用传输请求在传输请求状态变量3908中设置传输请求“完 成”变量。在下次传输请求从局部传输请求队列2904中弹出时将检查该变量,并且其将指 示对清理例程的需要。然后,图49中所描述的处理结束。如果TLvar大于15 (步骤4916的“否”结果),则其意味着当前页面请求对于传输 请求不是最后一个页面请求。在步骤4922中,将尾长度字段4009设为“0”。在步骤4923中,将页面请求传输长度字段4010设为15减去在头长度字段4008 中放置的值。对于不在超级页面的开始处开始的传输,其表示进入超级页面的偏移。在步骤4924中,将指向超级页面的指针放置到传输请求的页面请求指针阵列 3913 上。在步骤4925中,从TLvar减去15。在步骤4926中,将来自传输长度字段4010的值加到LBAvar上。在步骤4927中,将来自传输长度字段4010的值加到DPVar上。然后,处理循环回 到步骤4909,用于新页面请求。该循环继续,直到传输请求所要求的最后一个页面请求已被传输到子组队列上为止。图50图示闪存HEMi执行循环。该循环处理传输请求和页面请求的执行。在步骤5001中,闪存HEMi检查闪存端口,以确定其是否空闲(即,当前未使用于 向或从闪存组的传输中)。如果闪存端口不空闲(步骤5001的“否”结果),则页面请求处理程序不能操作。 在步骤5002中,闪存HEMi检查,以确定在局部传输请求队列2904上是否存在任何传输请 求。如果队列包含局部传输请求(步骤5002的“是”结果),则在步骤5003中,闪存 HEMi处理队列顶部的局部传输请求。跟随步骤5003之后,或者,如果队列不包含局部传输请求(步骤5002的“否”结 果),则在步骤5004中,闪存HEMi检查,以查看闪存HEMi的工作列表(例如,工作列表 4107)上是否存在任何传输请求。
67
如果工作列表包含指向传输请求的指针(步骤5004的“是”结果),则在步骤5005 中,闪存HEMi检查,以查看局部传输请求空闲列表2905是否包含任何空闲的局部传输请 求。如果有局部传输请求可用(步骤5005的“是”结果),则在步骤5006中,闪存HEMi 处理工作列表顶部的传输请求,其包括将传输请求复制到闪存HEMi的mRAM中以及产生页 面请求(见图49)。跟随步骤5006、或者如果工作列表上没有传输请求(步骤5004的“否”结果)、或 者如果没有空闲的局部传输请求(步骤5005的“否”结果),则在步骤5007中,闪存HEMi 检查当前状态,以确定其是否需要进入休眠模式。例如,如果作为步骤5001、5002以及5004 的“否”结果,已经到达步骤5007,则闪存HEMi不能对任何页面请求或传输请求操作,因此 将进入休眠模式。如上所解释,通过进入休眠状态,闪存HEMi节电,并且在传输请求被加入 到工作列表情况下允许其自身迅速响应。在不同的实施例中,当其它任务不可得时,闪存HEMi不进入休眠状态,而是调用 巡逻(patrol)功能处理程序。将在下文描述,该巡逻功能检查超级页面的错误,并且如果 必要,校正这些错误。在步骤5008中,闪存HEMi计算所需要的休眠时间段。其基于当前状态,并被设计 来在任何执行任务完成之前唤醒闪存HEMi。因此,例如,如果闪存端口正被级缓冲器用于闪 存传输,则闪存HEMi检查闪存传输计数寄存器2712,以确定传输的剩余部分将花费多久, 并接着设置休眠模式时间段,以便休眠模式将在传输完成之前结束。如上所解释,通过重复 一系列的空指令来设置休眠模式,从而基于所需要的休眠时间段确定所使用的空指令的数 量。在步骤5009中,闪存HEMi进入休眠模式。当其从休眠模式离开时,处理返回到步 骤 5001。如果步骤5001的检查指示闪存端口是空闲的(步骤5001的“是”结果),则在步 骤5010中,闪存HEMi检查子组位图2920,以确定是否有任何子组(a)被子组队列的顶部的 页面请求需要(设置了需要子组标志)以及(b)准备好(设置了子组R标志)。如果没有(步骤5010的“否”输出),则处理进行到步骤5002,以确定是否需要处 理任何传输请求。如果有子组既被需要又准备好了(步骤5010的“是”结果),则在步骤5011中,当 前子组被设为满足这两个标准的最低子组。例如,如果子组位图2920指示子组0、2和4都 具有所述两个标志被设置,则步骤5011将选择子组0。在步骤5012中,检查所选择的子组队列(本实施例中的队列0)的顶部上的页面 请求的状态变量字段,以确定该页面请求是否需要某些资源(例如,DMA信道)。如果页面 请求需要资源(步骤5012的“是”结果),则在步骤5013中,闪存HEMi确定该资源是否可 用。注意,对于闪存端口不需要检查,这是因为,在步骤5001中确认了它的可用性。如果必要的资源可用(步骤5013的“是”结果),或者如果不需要资源(步骤5012 的“否”结果),则处理进行到5014,在其中,检查包含在所选择的子组队列的顶部的页面请 求中的命令字段,以确定命令是读、读_修改_写还是擦除,并且调用和执行合适的页面请 求处理程序。
在页面请求处理程序返回之后,到达步骤5015。在该步骤中,检查来自处理程序的 返回值,以确定该处理程序是否已经使用了闪存端口。如果处理程序使用了闪存端口(步骤5015的“是”结果),则因为闪存端口现在忙 碌,不能执行此外的页面请求,并且处理进行到步骤5007,用于确定闪存HEMi是否可以进 入休眠模式。如果处理程序未使用闪存端口(步骤5015的“否”结果),或者如果没有足够的资 源可用于页面请求(步骤5013的“否”结果),则在步骤5016中,闪存HEMi检查子组位图 2920,以确定是否有更高编号的子组既被需要又准备好。在以上给定的示例中,其中,子组 0、2和4被需要且准备好,并且处理了子组0,步骤5016的结果将为“是”,这是因为子组2 比子组0高,而且被需要并准备好。另一方面,如果步骤5014已经处理了子组4,则在该示 例中,步骤5015的结果将是“否”,这是因为,即使子组0和2仍保持被需要且准备,也没有 比4高的子组满足该条件。如果有更高编号的子组既被需要又准备好(步骤5016的“是”结果),则在步骤 5017中,当前子组被设为该更高编号的子组。然后处理返回到步骤5012,其中对步骤5017 所选择的子组调用资源检查。如果没有更高编号的子组既被需要又准备好(步骤5016的“否”结果),则处理返 回步骤5004,以处理工作列表上的任何传输请求。注意,即使始终存在准备好处理的页面请 求,处理也不返回到循环的顶部(步骤5001),以便确保页面请求处理程序循环将被周期性 地中断,从而允许传输请求被定期地处理。只要系统被加电,该循环便无限地继续。图51图示了页面请求读处理程序。该流程图示出了 如果页面请求包含读命令, 则在步骤5014中进行的步骤。在步骤5101中,检查页面请求状态变量字段4011,以确定页面请求在哪个状态。 一般地,页面请求读经过三个状态进行命令、需要级缓冲器、以及闪存传输完成。在每个状 态之后,处理程序返回到图50所示的执行循环的步骤5015。注意,在命令和需要级缓冲器 阶段之后,页面请求保持在子组队列的顶部,从而,在这样的返回之后,闪存HEMi执行循环 将在以后返回到相同的页面请求。如果命令状态被设置(步骤5101的“命令”结果),则在步骤5102中,闪存HEMi 为与页面请求弹出的子组队列关联的闪存子组建立(assert) CS信号(例如,在线703上建 立 CS)。在步骤5103中,闪存HEMi建立CLE信号803,并将读命令的第一操作码(opcode) 置于总线709上。闪存HEMi知道基于页面请求命令字段4003中读命令的存在来使用该操 作码。CLE信号的建立需要在由CS信号所选择的子组中的闪存电路小片使能它们的命令锁 存,从而在总线709上发送的比特将被作为命令锁存。在步骤5104中,闪存HEMi建立ALE信号802,并且将用于读的物理地址置于总线 709上。从闪存读地址4006中获得用于闪存页面的该地址。如果传输以一偏移、而不是 在开头处开始进入页面,则从头长度字段4008中取得该偏移,并将其作为地址的一部分发 送。该偏移被用于设置页面缓冲器中向总线709的传输将开始的位置。注意,没有理由发 送在页面末端的偏移(尾长度),这是因为,一旦已经发送了合适数量的字节,则传输长度字段4010被用来停止该传输。因为用于正确的子组的CS信号保持被建立,所以,该子组上的闪存电路小片接收 ALE信号。该信号使它们将总线709上的比特锁存到它们的地址锁存中。如果上所解释,所 有四个电路小片接收相同的地址,并且,其是每个电路小片中一个页面数据的起始地址。还 如上所解释,子组的每个电路小片中的相同地址处的四个页面构成超级页面,并且,超级页 面表示15个区段,其构成与15个连续LBA关联的内容。在步骤5105中,闪存HEMi建立CLE信号803,并且将读命令的第二操作符置于总 线709上。CLE信号的建立需要由CS信号所选择的子组中的闪存电路小片使能它们的命令 锁存,从而在总线709上发送的比特将被作为命令锁存。当闪存电路小片接收到第二读操 作码时,它们自动地开始从闪存中的之前所指定的地址向页面缓冲器读取。在步骤5106中,闪存HEMi更新页面请求状态变量字段4011。在其它更新之中,当 前状态被设为需要级缓冲器。在步骤5107中,因为为命令状态所执行的系列步骤使用了闪存端口,但该使用很 短并已完成,所以,返回值被设置为闪存端口不忙碌。然后,页面请求读处理程序返回到图50的步骤5015。第二次为该页面请求调用处理程序时,作为步骤5014的结果,在步骤5101中检查 的状态是需要级缓冲器。在步骤5108中,检查级缓冲器,以确定其是否空闲。如果不是(步骤5108的“否” 结果),则页面请求读处理程序返回而不进行任何动作。如果级缓冲器是空闲的(步骤5108 的“是”结果),则在步骤5109中,级缓冲器被分配给该处理。在步骤5110中,闪存HEMi设立从闪存页面缓冲器(其由于闪存读而包含从闪存 读出的值)到级缓冲器的DMA传输。在步骤5111中,闪存HEMi更新页面请求状态变量字段4011。在其它更新中,当前 状态被设为闪存传输完成。这反映了闪存传输将独立于闪存HEMi而发生的事实,因为这是 DMA传输。在下次调用处理程序时,闪存传输将完成。在步骤5112中,因为在页面请求读的处理程序返回之后、闪存页面缓冲器与级缓 冲器之间的DMA传输将占用闪存端口一段时间,所以返回值被设为闪存端口忙碌。然后,页面请求读的处理程序返回到图50的步骤5015。在第三次为该页面请求调用处理程序时,作为步骤5014的结果,在步骤5101中检 查的状态是闪存传输完成。在步骤5113中,闪存HEMi确定作为向级缓冲器传输的一部分自动执行的ECC检 查是否在读取的数据中识别了任何错误。如果检测到了错误(步骤5113的“是”结果),则在步骤5114中,调用错误处理 程序。处理程序进行的方式取决于所检测的错误的性质和数量。如果所检测的数量太大而 不能校正,则错误处理程序可能使该数据被第二次读取,希望第二次读将产生更好的数据 (如在一个或多个闪存单元接近有效数据与错误之间的阈值的情况下所可能的)。如果所 检测错误的数量可以被校正,则错误处理程序可以通过ECC校正引擎3101校正数据(见联 系图31的讨论)。在步骤5115中,闪存HEMi设立从级缓冲器(其包含从闪存页面缓冲器读取的作为需要级缓冲器状态处理的结果的值)到数据路径DRAM107的DMA传输。在步骤5116中,页面请求读的处理程序等待。因为向DRAM的DMA传输非常块,所 以,读处理程序此时不返回,而是暂时停止。在步骤5117中,闪存HEMi检查,以查看传输计数寄存器2716是否具有0的值,其 指示DMA传输完成。如果不是(步骤5117的“否”结果),则等待步骤5116被重复。一旦 DMA传输完成(步骤5117的“是”结果),则在步骤5118中,为其它操作的使用释放级缓冲
ο在步骤5119中,将页面请求从子组队列中弹出。因为不需要该页面请求的进一步 处理,并且现在可以处理子组队列上的下一页面请求,所以完成这一步。在步骤5120中,闪存HEMi递减传输请求剩余页面请求字段3912,反映该页面请求 已经完成的事实。在步骤5121中,闪存HEMi检查,以确定剩余页面请求字段是否已经到达0。如果该字段已经到达0 (步骤5121的“是”结果),则其意味着用于该传输请求的 所有页面请求已完成。在步骤5122中,传输请求被添附到局部传输请求队列2904中,从 而其将被闪存HEMi执行循环处理。注意,此时,传输请求具有完成的状态(见图49,步骤 4921),从而,一旦其从局部传输请求队列中弹出,则将发起清理处理(见下文)。如果对传输请求有额外的页面请求剩余(步骤5121的“否”结果),或者当步骤 5122完成时,则到达步骤5123。在步骤5123,返回值被设为闪存端口不忙碌。然后,页面请求读处理程序返回到图50的步骤5015。图52更详细地图示闪存读操作的某些方面。在步骤5201中,闪存HEMi驱动CS/RB总线702中的一条为低。随后反转该信号, 使得信号在所选择的闪存子组的四个闪存芯片的芯片使能引脚上被接收为高。在步骤5202中,闪存HEMi驱动CLE信号803为高。这通知所选择的子组上的电 路小片下一组信号将包括命令。在步骤5203中,闪存HEMi驱动构成总线709上的读命令的第一阶段的八个比特。 如在闪存器件中惯常的,读命令的第一阶段指示闪存电路小片准备接收读地址。命令的第 一阶段构成八个比特,并且四个副本在32位的总线709上被并行地驱动。例如,如果第一 读命令是操作码08,则总线709上的信息将是08080808,并且,命令的一个副本将被递送到 每个电路小片。因为CLE先前已经被驱动为高,并且在所选择的子组的每个电路小片的CLE 引脚上被接收,所以,子组上的每个电路小片将该命令锁存到它的命令锁存中。在步骤5204中,闪存HEMi建立CLE信号为低,ALE信号802为高。这使闪存电路 小片准备接收地址。在步骤5205中,闪存HEMi发送要被读的地址的一个字节。这通过在总线709上 发送地址的四个副本而完成。其使得该字节被锁存到所选择的子组上的每个闪存电路小片 的地址锁存中。在步骤5206中,闪存HEMi确定是否已经发送了所有地址。如果不是(步骤5206 的“否”结果),则处理返回到步骤5205,以发送下一地址字节。在当前的优选实施例中,每 个地址由五个字节构成,所以该循环将重复四次。在当前的实施例中,五次地址选通(strobe)足以为闪存电路小片提供完全的地
71址。然而,典型的闪存芯片忽略超过芯片所需要的地址位的地址选通。为此原因,闪存电路 小片可以被更小和更廉价的闪存芯片取代,而不需要寻址机制的任何重设计,因为虽然更 小的闪存芯片将需要更少的地址字节(例如,四个字节而不是五个),但这些芯片将忽略所 接收的任何不必要的地址字节,从而它们将被合并到该系统中,而不需要降低地址周期数。 类似地,通过增加地址周期数,并因此增加地址字节数,系统可以被设计来处理任意大小的 闪存芯片,而不需要对更小的芯片的任何地址相关的重新设计。一旦已经发送了整个地址(步骤5206的“是”结果),处理以步骤5207继续,在其 中,CLE被建立并且ALE被撤销(deassert)。在步骤5208中,在A/D总线上发送读命令的第二阶段。传统上,读命令的第二阶 段使闪存芯片开始从闪存电路小片向页面缓冲器的读取。在步骤5209中,闪存电路小片每个都设置它们的准备好/忙碌引脚为忙碌。如上 所述,这些引脚每个都连接到进一步连接到SSD控制器106的引脚上的一个CS/RB线上。这 使得闪存HEMi辨认出闪存子组是忙碌的而不能接收额外的命令。联系图11详细地描述建 立忙碌信号的方式。在步骤5210中,每个闪存电路小片从所请求的闪存地址将数据提取到电路小片 的内部页面缓冲器中。在步骤5211中,来自闪存子组的R/B信号转变为“准备好”状态,其意味着所有四 个来自电路小片的准备好/忙碌引脚已经从“忙碌”状态转变到“准备好”的状态,指示所 请求的数据存在在每个芯片的页面缓冲器中,并且可被读取到总线709上。在步骤5212中,闪存HEMi建立RE。作为传统,其使得在所影响的子组上的电路小 片的页面缓冲器每个读取单个字节到总线709上。这四个字节构成一个双字。该双字被传 输到级缓冲器。在步骤5213中,递增闪存传输计数寄存器2712。该寄存器保持要被传输的双字 的数量。如果该读仅将传输页面的一部分,则闪存传输计数寄存器在合适的点停止传输,即 使页面缓冲器中可能存在额外的数据也是如此。下次使用该页面缓冲器时覆写所述额外数 据。在步骤5214中,检查闪存传输计数寄存器,以确定其是否已达到0。如果不是(步 骤5214的“否”结果),则处理返回步骤5212,以到达(clock out)下一双字。如果闪存传输计数为0(步骤5214的“是”结果),则从闪存的传输完成。此时,数 据在级缓冲器中。如上所述,接着,从级缓冲器将数据传输到数据路径DRAM,并且从那里通 过主机端口传输到主机。图53图示作为图50的步骤5014的部分的页面请求写处理程序的处理。如本领 域的普通技术人员所理解,闪存写不用新数据覆写闪存页面,而是用包含新数据的新闪存 页面取代旧闪存页面,并将旧页面无效。因此,如果写仅改变页面的部分,则必须在被称为 读-修改-写的操作中将未改变的页面部分复制到新页面中。页面请求写处理程序从步骤5301开始,其检查页面请求状态变量4011。在读-修 改_写操作的情况中,状态从将状态变量设置为命令开始。在命令状态的识别之后的处理(步骤5302-5307)与读处理程序中命令状态的识 别之后的处理(图51,步骤5102-5107)类似,这里将不再描述(应该理解,在实际软件实施
72例中这两组步骤可以被组合到单个软件例程中)。该处理以状态变量被设为需要级缓冲器 和级1而结束。此时,闪存已被设立来读取包含受制于所述写的LBA的超级页面。写处理 程序退出,并且,控制返回闪存HEMi执行循环(图50,步骤5015)。需要级缓冲器1状态的处理(步骤5308-5312)与读处理程序中需要级缓冲器状 态的识别之后的处理(图51,步骤5108-5112)类似。注意,虽然所影响的页面的全部存在 在闪存页面缓冲器中,仅包含在写中不改变的LBA的区段被复制到级缓冲器中。该处理以 状态变量被设为需要级缓冲器2而结束。写处理程序退出,并且控制返回到闪存HEMi执行 循环(图50,步骤5015)。在步骤5301中的需要级缓冲器2状态的识别之后的处理从步骤5313开始,其中, 进行关于ECC逻辑3102是否从闪存的数据读中检测到任何ECC错误的确定。如果检测到错误(步骤5313的“是”结果),则在步骤5314中,调用错误处理程 序。该处理程序进行的方式取决于所检测的错误的性质和数量。如果所检测的错误的数量 对于校正来说太大,则错误处理程序可以使数据读取第二次,希望第二次的读取将产生更 好的数据(如在一个或多个闪存单元的状态接近有效数据与错误之间的阈值的情况下所 可能的)。如果所检测的错误的数量可以被校正,则错误处理程序可以使得通过ECC校正引 擎3101校正数据(见联系图31的讨论)。如果未检测到错误(步骤5313的“否”结果),则在步骤5315中,设立DRAM到级 缓冲器DMA的传输。一旦闪存HEMi设立了 DMA传输,则DMA传输在没有HEMi进一步干预 的情况下自动进行。注意,该传输仅包括对应于在写中改变的LBA的数据,并且该数据与从 闪存中接收的数据合并,从而在该步骤之后,级缓冲器保持整个超级页面(四个页面)的数 据,包括新写入的LBA以及对于来自超级页面中的未被覆写的LBA的旧数据。步骤5316和5317与图51中的步骤5116和5117相同,将不再描述。在步骤5318中,设置CS信号。该步骤与图51中的步骤5102相同。在步骤5319中,设置CLE,并且将第一写操作码发送到闪存。该步骤与图51中的 步骤5103类似地操作。在步骤5320中,设置ALE,并且将用于写的地址发送到闪存。该步骤与图51中的 步骤5104相同。在步骤5321中,闪存HEMi设立从级缓冲器到闪存的DMA传输。然后,该传输自动 发生,而没有闪存HEMi的进一步参与。在步骤5322中,闪存HEMi更新页面请求状态变量,以指示下一状态是闪存传输完 成。在步骤5323中,将返回值设为闪存端口忙碌,跟随其后,写处理程序退出,并且控 制返回到闪存HEMi执行循环(图50,步骤5015)。此时,将数据的超级页面从级缓冲器传 输到闪存页面缓冲器,并且已经为从闪存页面缓冲器到闪存单元的写设立了闪存。在下次调用写处理程序时,在步骤5301中识别闪存传输完成状态。在步骤5324 中,设置Cs。其与图51的步骤5102相同。在步骤5325中,设置CLE,并且将第二写操作码发送到闪存。这使得闪存将值从闪 存页面缓冲器写入闪存。在步骤5326中,释放级缓冲器,以用于其它操作的使用。
在步骤5327中,闪存HEMi更新页面请求状态变量,以指示下一状态是页面请求完 成。在步骤5328中,将返回值设为闪存端口不忙碌,并且,写处理程序退出,并将控制 返回到闪存HEMi执行循环(图50,步骤5015)。此时,将数据从闪存页面缓冲器发送到闪
存单元。在步骤5301中的页面请求完成状态的识别之后的处理从步骤5329开始,其中,进 行检查,以确定在写上是否检测到任何错误。如果检测到错误(步骤5329的“是”结果),则在步骤5330中,调用错误处理程 序。该步骤与步骤5314类似地操作。如果未检测到错误(步骤5329的“否”结果),则处理在步骤5331到5335中继 续,它们与图51的步骤5119-5123相同。其后,写处理程序完成并退出,并且控制返回到闪 存HEMi执行循环(图50,步骤5015)。图53中所述的处理图示了读-修改-写操作。如果页面请求的传输长度是15,其 指示写将替换整个超级页面,则该操作的读-修改部分不必要,并且不使用该命令和需要 级缓冲器1路径。替代地,页面请求状态变量从需要级缓冲器2状态开始。如上所述,在写操作的情况中,需要闪存HEMi向页面请求分配超级页面。图54中 的流程示该处理。在步骤5401中,闪存HEMi使用由传输请求分配给页面请求的第一个LBA作为用 于进入转发表3201的查找的索引,并且识别当前保持与LBA关联的数据。在步骤5402中,闪存HEMi检查超级页面指针列表2919,以确定子组上是否有任何 可用的超级页面。选择用于读_修改_写的子组设法使用相同子组上的超级页面作为保持 原始数据的超级页面。这大大增强性能,这是因为,可以通过从闪存向闪存页面缓冲器的数 据读处理事务的读取侧,而不需要任何向级缓冲器的读。然后,在页面缓冲器中合并新和旧 的数据。通过避免向级缓冲器的读,该方法提高了写操作的性能,并避免了占用闪存接口, 从而使其空闲用于其它事务。如果子组上有超级页面可用(步骤5402的“是”结果),则处理进行到步骤5403, 其中,在超级块元数据表3501中检查对应于超级页面的条目,以确定超级页面是否已被识 别为有缺陷。如果超级页面是有缺陷的(步骤5403的“是”结果),则处理进行到步骤5404,其 中,跳过有缺陷的超级页面。然后,处理返回步骤5402。如果超级页面是无缺陷的(步骤5403的“否”结果),则处理进行到步骤5412,下 文对其描述。如果子组上无可用的超级页面(步骤5402的“否”结果),则在步骤5405中,闪存 HEMi递增子组,由此移动到下一子组,并且如果必要,轮转回到子组0。在步骤5406中,闪存HEMi确定其是否已经检查了闪存组中的所有子组(即,当前 子组是否与被检查的第一个子组相同)。如果不是(步骤5406的“否”结果),则闪存HEMi 返回到步骤5402,以确定下一子组上是否有超级页面可用。注意,作为步骤5405中递增的 结果,每次检查通过新子组。如果检查了所有的子组并且无超级页面可用(步骤5406的“是”结果),则当前开放的超级块满了且必须被关闭,而且必须开放新超级块。在步骤5407中,闪存HEMi将用于 当前开放的超级块的超级块元数据表3501从数据路径DRAM 107复制到开放的超级块的子 组0的超级页面0。这通过发出用来移动数据的内部传输请求而被完成。在复制操作之前, 设置该表的关闭标志3509。在步骤5408中,闪存HEMi使下一超级块从超级块空闲列表2912中弹出,并且将 该超级块的标识符复制到开放的超级块指针2914中。在步骤5409中,闪存HEMi将当前时间写入对应于新开放的超级块的反转表(例 如,反转表3205)中的时间戳字段中。在步骤5410中,闪存HEMi将超级块元数据表从新开放的超级块的子组0的超级 页面0复制到数据路径DRAM 107的超级块元数据表3501中。此时,除缺陷和擦除计数信 息以及开放标志3508 (其被设置)之外,该表是空白的。在步骤5411中,闪存HEMi初始化超级页面指针列表2919。因为超级块元数据表 占用了超级页面0,所以,用于子组0的所述指针被设置到超级页面1。所有其它指针被设 为超级页面0。然后,处理返回到步骤5402,用于向页面请求分配超级页面。如果子组上有无缺陷的超级页面可用,则到达步骤5412 (步骤5403的“否”结果)。 在步骤5412中,闪存HEMi将指针列表上的下一超级页面分配给页面请求,从当前子组选择 条目。闪存HEMi将超级页面的地址写入页面请求的闪存写地址字段4007中。注意,因为 闪存地址的特征在于端口、子组、块和页面,所以整个地址可得。因为该闪存HEMi仅对单个 端口操作,所以不需要端口信息,而且,基于用于识别使用了哪个超级页面列表的超级块标 识符、超级页面号以及子组的组合,子组、块和页面信息可得。在步骤5413中,闪存HEMi通过递增用于相关子组的指针而更新超级页面指针列 表,以反映在步骤5412中分配的超级页面。然后,该操作的处理结束。在图55中描述完成的事务的清理。在该流程图中描述的处理被作为图50的步骤 5003的部分执行。此时,作为页面请求处理程序确定用于传输请求的最后一个页面请求已 经完成的结果(例如,图51,步骤5122),作为主机发起的读或写命令的部分调用的传输请 求在局部传输请求队列上。在步骤5501中,传输请求从局部传输请求队列中弹出。由在闪存HEMi上运行的 传输请求处理程序执行步骤5501到步骤5504。在步骤5502中,检查传输请求状态变量字段3908。一般地,队列上的传输请求将 具有完成的状态(见,例如图49,步骤4921),主要例外是作为垃圾收集例程的部分调用的 传输请求。在该情况中,因为传输请求来自于完成的读或写命令,所以其具有完成的状态。在步骤5503中,将在页面请求指针阵列3913中识别的页面请求放置在页面请求 空闲列表2910上。这些页面请求现在可用于被其它传输请求使用。在步骤5504中,将内部传输请求放置在局部传输请求空闲列表2905上。该内部 传输请求现在空闲,以被分配给闪存HEMi的外部工作列表上的传输请求。传输请求处理程 序调用在闪存HEMi上运行的IOP处理程序,并终止。在步骤5505中,在闪存HEMi上运行的IOP处理程序递减在传输请求的调用IOP 字段3902中识别的IOP的剩余传输请求字段3808。注意,此时,IOP不在任何HEMi的工作列表上,从而,即使它不在闪存HEMi的工作列表上,也允许闪存HEMi访问它。在步骤5506中,闪存HEMi确定剩余传输请求字段是否已达到0,其指示IOP不具 有有效的传输请求。如果该值大于0(步骤5506的“否”结果),则传输请求处理程序结束。因为IOP 还未完成,所以不需要清理。如果该值是0(步骤5506的“是”结果),则在步骤5507中,将IOP放置在用于与 在IOP的主机端口字段3803中识别的端口关联的传送HEMi的工作列表上。然后,在闪存 HEMi上运行的IOP处理程序终止。在步骤5508中,评估IOP命令字段3806,以确定IOP是否涉及读或写命令。由在 传送HEMi上运行的IOP处理程序执行这个以及所有后续步骤。如果命令是读命令(步骤5508的“是”结果),则在步骤5509中,传送HEMi设立 数据帧和向主机传输数据所必需的其它帧,并且将这些帧传送到主机。在步骤5509之后,或者如果命令是写而不是读(步骤5508的“否”结果),则在步 骤5510中,传送HEMi向主机传送指示命令已被完成的状态帧。在步骤5511中,传送HEMi (a)将在IOP CDBinfo字段3805中识别的CDBinfo放置 在CDBinfo空闲列表4102上,(b)将IOP放置在IOP空闲列表4103上,以及(c)将在IOP 传输请求指针阵列3809中识别的传输请求放置在传输请求空闲列表4104上。在步骤5512中,传送HEMi清理各种其它数据结构,以反映⑶Binfo和IOP的关闭。 例如,传送HEMi递减用于在IOP启动器字段3804中识别的启动器的启动器信息条目中的 计数字段4203。然后,清理处理结束。C.垃圾收集垃圾收集是释放闪存空间用于新写入的处理。当与每个端口关联的闪存HEMi确 定是否需要垃圾收集用于与该端口关联的闪存组,并且如果必要执行垃圾收集操作时,在 闪存端口上以闪存端口为基础执行该处理。每个闪存组包括大量超级块,这些超级块处于三个状态之一 (1)开放(当前对写 开放的单个超级块);(2)关闭(已被写入数据的超级块,但其不再对写开放);以及(3)空 闲(超级块空闲列表2912上的超级块,其已被擦除并可用于将来的写)。关闭的超级块通 常包括有效超级页面(包含带有当前有效的数据的区段)和无效超级页面(包含带有对应 于已被后续地写入其它地方而因此不再有效的LBA的数据的区段)的组合。如联系图34 所解释,在用于闪存组的反转表中如此指定无效超级页面。为了操作,每个闪存组需要空闲超级块,这是因为,如果开放的超级块未包含用于 写的足够空间(即,在超级页面指针列表2919上没有示出空闲超级页面),则该超级块必须 被关闭,必须开放来自超级块空闲列表的超级块,并且,必须将新数据写入新开放的超级块 中。垃圾收集是整合(consolidate)数据来为未来的写释放超级块的处理。返回到图29,在当前的优选实施例中,在每次从超级块空闲列表2912分配超级块 时,递减相关闪存HEMi的mRAM中的超级块空闲列表计数器2913。该计数器包含当前在超 级块空闲列表2912上的超级块的数量。在递减计数器2913之后,将计数器当前保持的值与在闪存HEMi的mRAM的垃圾收集阈值段2915中保持的两个值(临界阈值和非临界阈值)比较。在当前的优选实施例中, 在初始化时,将这些值分别设置为缺省值“2”和“6”,但如下所讨论,可以使用其它值。此 外,这些值是可编程的,因此可以由用户改变。如果计数器值(以及因此的超级块空闲列表上的超级块的数量)在临界阈值或低 于临界阈值,则设置临界标志,并且,闪存HEMi移入临界垃圾收集模式,其中垃圾收集操作 优先于包含主机读和写的所有其它操作。这继续直到计数器值(以及因此的超级块空闲列 表上的超级块的数量)超过临界阈值为止,这引起临界标志被复位。如果计数器值大于临界阈值、但在非临界阈值点或低于非临界阈值,则闪存HEMi 移入非临界垃圾收集模式,并且发起垃圾收集操作,但仅在已经处理了所有主机发起的读 和写之后。如果可用的空闲空间量大于非临界阈值,则垃圾收集不发生。在当前的优选实施例中,临界阈值被设为2,这是因为,所有时候都至少需要一个 空闲的超级块,以确保可以接纳即将到来的写,并且,需要一个附加的超级块来针对临界标 志被设置之前在局部请求队列2904上的传输请求可能用光附加超级块的可能性提供保 护。注意,甚至在临界模式中,已经在局部传输请求队列上的传输请求也将在垃圾收集传输 请求之前被闪存HEMi处理,该垃圾收集传输请求与所有其它新传输请求一样被添附到局 部传输请求队列2904的底部。在当前的优选实施例中,非临界阈值被设为“6”,其表示降低垃圾收集的频率(需 要更低的数)与最小化主机发起的写的序列可能被对临界模式垃圾收集的需要中断的可 能性(需要更高的数)之间的折衷。在替代实施例中,该数可以被设得略高或略低。注意, 更低的数将倾向降低垃圾收集的频率,并因此将增加超级块在被垃圾收集之前保持关闭的 时间量。由于随着时间的过去超级块包含的有效数据量将倾向减少(因为超级块中的有效 超级页面是新写入的主题,所以被无效),因此垃圾收集对更老更旧的超级块更有效率,这 是因为,这种超级块包含更少的必须被复制到开放的超级块中的有效信息。因此,将非临界 阈值设置为更低的值倾向于通过增加给定超级块在被垃圾收集前关闭的时间量而提高垃 圾收集操作的效率。然而,再次,这是一种折衷,因为该数越低,将越有可能达到临界阈值, 此时,系统性能将下降,这是因为临界模式垃圾收集优先于常规读和写。在图56所示的流程图中图示垃圾收集的处理。垃圾收集的需要选择用于擦除的超级块。这在步骤5601中表示。因为其需要将来 自所选择的超级块中的有效超级页面的数据写到当前开放的超级块中,所以,选择具有最 少量有效数据的超级块是合理的。因此,当发起垃圾收集时,相关的闪存HEMi对用于闪存 组的反转表中的每个超级块检查计数字段,从最近加入到超级页面空闲列表中的超级块之 后的超级块开始(例如,如果作为垃圾收集的结果而加入到空闲列表的最后一个超级块是 17,则在下一次垃圾收集操作中第一个被检查的超级块计数字段将是超级块18),并且以编 号顺序经过每个超级块进行,回卷到超级块0。闪存HEMi利用最高的计数字段值(指示最大数量的无效页面)选择超级块。如 果对于最高计数字段,多于一个超级块是持平的,则在当前的优选实施例中,选择所遇到的 第一个这种超级块用于垃圾收集。在可选的实施例中,可以通过对每个持平的超级块检查 超级块元数据表(或反转表)中的擦除计数字段来打破持平,其中选择具有较低擦除计数 的超级块。该选择具有施加一定程度的磨损均衡的优点。本领域的普通技术人员将理解,擦除操作倾向造成对闪存的损耗,从而具有更高次数擦除的那些块将趋向具有更高数量的 缺陷。该类型的磨损均衡趋向横跨块平均化缺陷数量,然而付出了在每个垃圾收集之前施 加额外操作的代价。一旦超级块被选择用于垃圾收集,则在步骤5602中,关联的闪存HEMi创建足够将 数据从该超级块中的每个有效的超级页面移动到当前开放的超级块中的一系列内部传输 请求。内部传输请求由特定闪存HEMi发出并专用于特定闪存HEMi。它们与常规传输请 求的不同在于内部传输请求仅被保持在发出请求的闪存HEMi的mRAM中,而永远不存储在 共享RAM中或被任何其它HEMi操作。因为内部传输请求不作为IOP的结果而被调用,所以 每个内部传输请求的调用IOP字段3902被留为空白。如上所述,每个传输请求可以发出三个页面请求,并且每个页面请求可以引起一 个超级页面数据的传输。因此,闪存HEMi需要发出以移动数据的内部传输请求的数量将等 于超级块中的有效超级页面的数量除以3(向上取整)。在当前的优选实施例中,假定每个闪存组八个块,每个超级块包含512个超级页 面(每个块64个超级页面X8),所以,理论上,垃圾收集可能需要发出171个传输请求(不 过,应该理解,如果超级块中的每一个超级页面都是有效的,则在对超级块执行垃圾收集将 没有意义)。然而,实践中,因为被选择用于垃圾收集的超级块倾向具有相对较少的有效超 级页面,所以需要远小于171个传输页面。在步骤5603中,执行作为在步骤5602中设立的传输请求的结果而发出的页面请 求。应该理解,步骤5602和5603将很可能重叠,这是因为,要求用于从旧超级块向开放的 超级块移动有效超级页面的传输请求的数量将可能超过6,其是可以同时被闪存HEMi处理 的传输请求的数量。因此,某个数量的传输请求将被分配,然后,将为这些传输请求执行页 面请求,并且当每个传输请求完成时,它在局部传输请求表2901中的存取位置将开放,从 而允许闪存HEMi发出新传输请求。除了没有外部数据之外,将数据从有效页面请求复制到当前开放的超级块中的操 作与常规写操作类似。如上文联系超级页面指针列表2919的描述所描述的,优选地,写对 在与将被该写无效的超级页面所在子组相同的子组上的超级页面发生。这最小化所需要的 传输的数量,这是因为,从闪存子组的一个位置到同一子组中的另一位置的写不需要将数 据移动到闪存级缓冲器,而可以通过将数据从闪存写入闪存页面缓冲器并接着从闪存页面 缓冲器写入闪存来完成。这大大快于需要将数据传输到级缓冲器的移动,并且不占用将级 缓冲器与闪存组连接的总线。使用超级页面指针列表2919,垃圾收集写优先针对同一子组。一个页面请求可以 处理从闪存的读与向闪存的写两者,所以单个传输请求可以处理三个有效超级页面。与常 规写一样,每次来自有效超级页面的数据被复制到新位置时,更新转发表3201中对应于这 些LBA的条目。在将数据从旧超级块移动到开放的超级中的传输请求之后,在步骤5604中,发出 三个传输请求,一共包含七个页面请求(各有三个页面请求在开始的两个传输请求中,且 一个页面请求在第三个传输请求中)。这些页面请求中的每个对单个块执行闪存擦除命令。 如上所述,每个超级块在端口的八个子组的每个中包括相同的块。因此,每个页面请求在不同芯片选择(chip select)上擦除相同的块。如本领域的普通计数人员将理解的,闪存擦 除命令引起向被擦除的块中写入一系列的“1”。这七个页面请求擦除超级块的块1-7。
垃圾收集操作所需的最后一个传输请求包含三个页面请求。在步骤5605中,这些 页面请求中的第一个将缺陷列和擦除计数从存储在超级块的子组0、超级页面0中的超级 块元数据表(见图35)中复制到闪存级缓冲器中。注意,其驻留于超级块的块0中,不在步 骤5604中擦除块0。 在步骤5606中,闪存HEMi递增超级块元数据表中的擦除计数字段3507,反映该超 级块现在被擦除了附加的一次的事实。在步骤5607中,闪存HEMi在数据路径DRAM 107中访问用于闪存组的反转表,将 来自该超级块的所有超级页面标记为有效,并将用于该超级块的计数字段设为0。在步骤5608中,来自最后一个传输请求的第二个页面请求擦除块0。注意,这个以 及步骤5609-5610可以与步骤5607并行发生。在步骤5609中,最后一个页面请求将擦除计数和缺陷数据从级缓冲器复制回到 超级块的子组0的超级页面0中,因此,在闪存中设立新的超级页面元数据表,其除了这些 条目之外是空白的。在步骤5610中,将超级块放置回超级块空闲列表2912上,并且递增超级块空闲列 表计数器2913。然后,用于该超级块的垃圾收集操作完成。虽然当前的优选实施例将有效数据从旧超级块复制到当前开放的超级块中,但正 如在主机发起的写的情况中所发生的,在替代实施例中,同时具有两个“开放”超级块,一个 用于常规读,第二个用于收集来自正在被通过垃圾收集处理回收的超级块的数据。在该实 施例中,识别了垃圾收集发起的传输请求(例如,通过传输请求中的垃圾收集标志),并且 使得数据被写入开放的垃圾收集超级块,而不是用于主机发起的写的开放超级块。与当前对写开放的超级块中的有效数据相比,由垃圾收集产生的有效数据相 对“旧”。为此原因,将由垃圾收集产生的有效数据复制到垃圾收集超级块中将倾向集中 (concentrate)相对旧并因此较不可能被高频率使用的数据。本领域的普通技术人员将理 解,不是最近写入的数据在近未来被读或写的可能性大大小于更近的数据。“垃圾收集”超级块的使用具有在一个或多个超级块中压缩相对旧的数据的优势。 因为这种数据被覆写的可能性相对较小,所以这种超级块将倾向用有效数据填充。如果,如 上所述,垃圾收集被优先施加于带有相对较高比例的无效数据的超级块,则用作垃圾收集 的库(repository)的超级块将很可能它们自身不经受垃圾收集。这具有期望是相对静态 的数据将在相对较小数量的超级块中集中、以及该数据将不被垃圾收集的优点,因此不必 要经常地将该数据复制到新超级块作为垃圾收集处理的一部分。相反地,用于常规写的超 级块将倾向包括经常被使用和重写的数据的集中。因此,这种超级块将倾向包括相对较高 比例的无效超级页面。当这种超级块自身经受垃圾收集时,将必须从超级块中复制出来的 有效数据的数量将相对较低,从而降低了垃圾收集所需要的时间。因此,尽管以额外的复杂度为代价,但通过最小化垃圾收集操作所必需的时间量, 垃圾收集超级块可以提高性能。在该替代实施例的扩展中,使用分级的存储器系统,包括相对昂贵的快速存储器 和相对较便宜的慢速存储器。用于存储在垃圾收集期间收集的数据的超级块被存储在慢速存储器中,这是由于,这种超级块被预期包括不需要与更近被更新、因此被存储在保持在快 速存储器中的超级块中的数据在相同的频率基础上的数据。D.巡逻功能如在本领域中所理解,闪存中数据完整性可能因为各种原因而退化 (deteriorate) 0在每次读期间,页面的单元内的电荷可能轻微地耗散,导致单元中的电压 退化直到该电压不再可以被正确地读取为止。相邻页面也可以被读操作影响,从而导致这 种页面的单元中的电压退化,即使实际的单元未被读取。这被称为“读干扰”。随着时间的 过去,该耗散可以导致单元电压下降到阈值之下,并导致“1”记录为“0”。如果不处理这些 错误,则随着时间的过去,可以存在比通过ECC可恢复的错误更多的错误,并且数据损坏可 发生。此外,编程(写)或擦除存储器单元也可降低性能并导致数据错误的增加。例如, 当编程或擦除单元时,可能需要提高的电压来使电荷流入或流出浮栅。然而,提高的电压可 以对用于形成单元的半导体材料施加压力。随着大量的编程或擦除周期,单元有效地存储 存储电荷的能力降低,导致数据中增加的错误。自闪存单元被写入起的时间量也可对数据不可靠性有贡献。注意,这些问题可能、也可能不是源自导致超级页面被识别为有缺陷的闪存中的 物理缺陷。物理缺陷是永久性的,并且,所影响的超级页面被永久地映射出去而不再被使 用。替代地,由超级页面上的一个或多个闪存单元所保持的电荷的降低产生的这些类型的 错误是瞬时的。这种瞬时的错误的检测不需要超级页面被识别为有缺陷,并且这些错误本 身可以通过使用ECC校正。然而,ECC仅可以校正每页面给定数目的错误。此外,一旦页面的完整性开始被诸 如上面所列举的因素(例如,读干扰、写干扰等)影响,页面上的错误数量将可能随着时间 增加,从而,在某些点上,页面上的信息将不可恢复。错误处理始终是面对企业级闪存存储的最重要的挑战之一。如本领域所公知的, 闪存存储具有相对较高的错误率,而且,这被与以下事实结合,即闪存系统中的错误校正 需要使用花费大量系统资源的读_修改_写操作来写入完整页面。SSD控制器106独特地适合处理闪存错误,这是因为,大量处理器和多个独立的流 水线允许SSD控制器106或多或少连续地检测和校正错误,而不降低主机角度的系统性能。SSD控制器106的设计在错误校正算法上允许很大的选择,这里描述算法中的几 个。在一个实施例中,SSD控制器106使用独立的巡逻功能,其包括在独立地“巡逻” 每个闪存组的每个闪存HEMi上运行的固件,读包含有效信息的每一个超级页面,以及校正 超过阈值的错误。图57中图示了该实施例。图57的流程图从图50的步骤5004的“否”结果开始。如上文联系图50所述,步 骤5007-5009在某些情况中可以由巡逻功能取代。步骤5701表示确定巡逻功能是否正在操作的检查。在一个实施例中,巡逻功能周 期性地操作。在该实施例中,该功能检查闪存组中每一个有效的超级页面,然后关闭一段时 间。例如,巡逻功能可以每24个小时运行到完成一次。在该实施例中,一旦巡逻功能完成, 则其将直到所指定的时间段完成前都不会重新开始,例如,其可以在每个午夜开始,运行到
80完成(如下所解释,该功能被周期性地中断,以允许其它操作发生),然后关闭直到下一个 午夜。在巡逻功能周期性地运行的实施例中,步骤5701的“否”结果导致图50的步骤 5007,其中,闪存HEMi可以进入休眠模式。在巡逻功能连续地操作(再次,该功能被中断用于其它任务)的实施例中,步骤 5701被跳过。在这些实施例中,或者如果巡逻功能是操作中的(步骤5701的“是”结果),则 在步骤5702中,进行检查,以确定是否有任何局部传输请求可用。注意,在优选实施例中, 这个以及下面某些的步骤不表示独立的巡逻功能程序,而是对通常用于主机发起的读和写 (例如,图49)的固件例程的调用。如果无局部传输请求可用(步骤5702的“否”结果),则处理进行到图50的步骤 5007。如果有局部传输请求可用(步骤5702的“是”结果),则在步骤5703中,局部传输 请求被弹出。在步骤5704中,局部传输请求被填充。一般地,这反映(mirror)用于主机发起的 事务(见例如图49)的处理,其中,对命令字段3907使用读命令。然而,用于传输请求的LBA 范围基于该闪存组上用于巡逻功能的紧挨在前的反复的LBA范围,并考虑在闪存组之间使 用的LBA分条,目标为覆盖分配给闪存组的所有LBA。在初始化之后巡逻功能第一次运行时(或其在周期性的关闭之后第一次重新开 始时),传输请求将被分配存储在闪存组中的90个LBA。下一次,传输请求将被分配存储在 闪存组中的接下来的90个LBA,等等,直到到达闪存组中存储的最后一个LBA为止,此时,巡 逻功能将从头重新开始(如果其连续地运行),或者关闭,等待下一触发事件(例如,下一午 夜)。巡逻功能使用闪存HEMi mRAM中的数据结构(例如局部变量2916中的变量)追 踪最近分配的LBA。如上所述(见,例如图16和所附讨论),LBA在闪存组之间被分条。因此,巡逻功能 不能够简单地将下90个LBA分配给传输请求,而替代地,必须识别已经被分配给闪存组的 下一组的90个LBA。这可以通过读整个转发表3201来发现带有与巡逻功能在其上运行的 闪存组相等的端口值的下一行而完成。可选地,巡逻功能可以使用与用于首先将LBA分配 给闪存组(例如,以90个的分条分配的LBA,带有等于90乘以闪存组的数量的间隙(gap)) 相同的算法。在步骤5704中对局部传输请求的填充之后,在步骤5705中,三个页面请求被弹出 并被填充,各自接收分配给传输请求的45个LBA中的15个。上文联系图49描述了页面请 求被填充的方式。在步骤5706中,页面请求被发送到子组队列。这是与用于产生页面请求来处理主 机发起的事务相同的处理。参见例如图49。在步骤5707中,执行页面请求读。注意,数据被读到闪存缓冲器,但不被传送到数 据路径DRAM 107。替代地,读的唯一目的是触发ECC检查。如上联系图31所述,每次数据 被读到存级缓冲器时,ECC检查3104操作,并且,如果发现了错误,则将数据传送到ECC校 正引擎3101。[1004]在步骤5708中,检查由ECC检查3104设置的指示器,以确定是否检测到任何读错 误。如果没有(步骤5708的“否”结果),则处理进行回到图50的循环的开始。这允许闪 存HEMi处理其它非巡逻功能任务,甚至在巡逻功能运行的同时也是如此,并且确保巡逻功 能将不显著地降低对于主机发起的读和写的性能。如果无其它操作被要求,则当图50的循 环返回到步骤5004时,来自该步骤的“否”结果将再次触发巡逻功能,这次使用45个LBA的 新组。如果检测到读错误(步骤5708的“是”结果),则在步骤5709中,将包含错误的区 段发送到ECC校正引擎3101。上文联系图31描述ECC校正。在步骤5710中,检查由ECC校正引擎3101校正的错误的数量,以确定其是否超过 可允许的错误的阈值,当前实施例中该值设为8 (见上文,联系图31)。如果错误的数量等于或低于阈值(步骤5710的“否”结果),则巡逻功能将控制返 回到图50的步骤5001。如上联系图31所述,如果所检测的错误的数量不超过该阈值,则不 将所校正的数据写入到闪存中。如果错误的数量超过阈值(步骤5710的“是”结果),则在步骤5711中,使用读-修 改-写操作将所校正的数据写入到新超级页面中。见图53,以及上文所附的描述。在步骤5711之后,巡逻功能将控制返回到图50的步骤5001。图57描述巡逻功能的一个实施例,其中,该功能独立地在每个闪存组上运行。这 由于独立的闪存HEMi服务每个闪存组的事实而变得可能。SSD控制器106中固有的处理能 力允许闪存错误被连续地或周期性地检测和校正,而对整个系统性能没有任何影响,并且 不需要设法预测闪存中的哪些区域特别易于有错误。在不同的实施例中,SSD控制器106发出用于巡逻功能的Ι0Ρ。每个IOP指定一个 LBA范围,并且,IOP被周期性地发出直到覆盖了由SSD控制器106管理的整个LBA范围。 在该实施例中,不必要单独地计算哪些LBA被分配到哪些闪存组,这是因为,当SSD控制器 106处理IOP (见上文)时其被自动地处理(见上)。在该实施例中,不进行检查来确定是否有其它的任务正等待被处理。为此原因,应 该隔开IOP发出(例如,一分钟一个)。此外,在一个替代选择中,作为巡逻功能IOP的结果 而被调用的传输请求和页面请求可能被识别为具有较低的优先级,并在其它传输请求和页 面请求(见上文)之后被处理。E.中止处理需要SSD控制器106来正确地响应SCSI中止命令、以及其它相关协议中的类似命 令。中止命令可能需要中止特定的读或写命令,或者所有来自特定启动器的命令。SSD控制 器106还必须正确地响应硬复位,其中,所有当前的命令被中止,并且系统返回到缺省的上 电状态。在中止命令或硬复位之后,存储在经受了已中止的写命令(其已开始,但在中止 之前未结束)的LBA中的数据在未定义的状态中,并且,需要启动器重写这种数据,以将其 返回到已知状态。在请求中止特定命令的情况中,SSD控制器通过以下步骤响应识别与中止命令 一起接收的SCSI标签,并将该信息与存在在CDBinfo表4109中的CDBinfo中的SCSI标 签字段3705匹配,由此识别响应于现在正被中止的命令而被创建的⑶Binfo。然后,该⑶Binfo的IOP字段3704被用于识别被调用来处理事务的Ι0Ρ。接着,检查该IOP的传输 请求指针阵列3809,以识别作为该IOP的结果而被发出的每个传输请求。然后,中止这些传 输请求中的每个,意味着设置了它的中止标志3906,并且,闪存HEMi执行循环为每个传输 请求发起中止处理程序。中止处理程序将传输请求置入完成的状态,并且,将在页面请求指 针阵列3913中识别的所有页面请求从子组队列中移除。页面请求、传输请求和IOP的清理 如联系图55所描述的进行。中止队列命令需要中止由负责中止队列命令的启动器发出的所有命令。根据伴随 中止队列命令的元数据识别该启动器。识别该启动器的所有CDBinfo和IOP通过被从所有 工作列表中移除而被停用(retire),并返回到它们的空闲列表中,并且,由这样的IOP发出 的所有传输请求也被停用。硬复位需要求终止所有有效的命令。在一个实施例中,通过在所有有效的IOP中 设置中止标志3811而不采取其它动作来处理它。当IOP被发送到传送HEMi用于向主机发 送数据(对于写)或状态信息(对于读)的目的时(见图55,步骤5507),传送HEMi读取中 止标志并终止IOP的处理,而不向主机发送任何通信。否则,事务正常地完成。因此,在该 实施例中,因为除了不向主机发送通信外所有的事务正常地完成,所以不需要特殊的处理。在替代实施例中,硬复位使得在所有有效的IOP和传输请求上设置中止标志。一 旦这完成了,从HEMi工作列表中弹出的IOP和传输请求便不被处理,而是被忽略,并且,所 有页面请求被从子组队列中移除。一旦所有的HEMi都没有了工作(由于所有页面请求、IOP 和传输请求的停用),则控制被转交给ARM 2002,其负责清理,包括将所有页面请求、IOP和 传输请求返回到空闲列表,以及将所有状态参数设为缺省值。该替代实施例比允许所有事 务完成更快,但使用特殊处理的需求引入了软件错误的风险。F.掉电恢复如上所述,数据路径DRAM 107被用于存储转发和反转表。因为从DRAM的读以及 向DRAM的写比对闪存的读或写快得多,所以在DRAM中存储该信息提供了很大的性能优势, 特别是需要对这些表的大量的写的情况下。然而,因为DRAM 107是易失性存储器,所以,如果意外地掉电,则必须重建这些 表,正如必须为每个闪存端口重建用于当前开放的超级块的超级块元数据表一样,如上所 述,超级块元数据表也被存储在DRAM 107中。通常,使用存储在闪存超级页面元数据字段中的信息重建开放的超级块元数据 表,并且使用存储在闪存中的超级块元数据表和重建的开放超级块元数据表中的信息重建 转发和反转表。图58图示了这一点,其示出了用于单个闪存组的重建处理。在步骤5801中,当前超级块被设为0。其设立了穿过闪存组中的所有超级块的循 环。在步骤5802中,将用于当前超级块的超级块元数据表3501从闪存复制到级缓冲 器。从级缓冲器中的表读取或写入级缓冲器中的表比读取或写入闪存中的表更容易。在步骤5803中,检查超级块元数据表开放标志3508和关闭标志3509,以确定在掉 电时超级块是否在被擦除的状态下。如果所述两个标志都被清除(步骤5803的“是”结果),则这意味着超级块被擦除。 在步骤5804中,将超级块放置在超级块空闲列表2912上,其后,处理以步骤5821继续,如下所述,其触发对下一超级块的分析。如果超级块未被擦除(步骤5803的“否”结果),则在步骤5805中,检查开放和关 闭标志,以确定超级块在掉电时是否开放。这通过开放标志被设置和关闭标志未被设置而 被指示。注意,该步骤可以与步骤5803组合。如果超级块在掉电时是关闭的(步骤5805的“否”结果),则在步骤5806中,对于 该超级块,将来自超级块元数据表的超级块时间戳3506复制到反转表的时间戳字段3405 中。该步骤用对于该超级块正确的时间戳信息来更新反转表。在步骤5807中,子组被设为0。其设立通过所有子组的循环,注意,每个超级块在 每个子组上包括单个块。在步骤5708中,超级页面被设为0。其设立通过块中的64个超级页面的循环。在步骤5809中,用于当前超级页面和子组的超级块元数据表的LBA字段被用作用 于向转发表3201中查找的索引。注意,子组0、超级页面0是特殊情况,这是由于,该超级页 面包含超级块元数据表,从而在分析中跳过该超级页面。如果用于LBA的转发表行已经被填充(步骤5809的“是”结果),则这意味着在重 构期间已经遇到了 LBA,从而意味着LBA至少被两次写入开放超级块。这需要将最后的这样 的写识别为有效,并将任何在先的写无效。在步骤5810中,来自对应于LBA的转发表行的 数据被用于识别LBA被写入其中的超级块。将用于在先超级块的反转表时间戳字段3405 与来自用于当前正被评估的超级块的超级块元数据表的时间戳字段3506比较。如果反转表时间戳低于(早于)超级块元数据表时间戳(步骤5810的“<”结 果),则这意味着已经在转发表中的条目随后被当前正被评估的超级块元数据表中反映的 较新的条目替换。在该情况中,在步骤5811中,对应于现有的用于LBA的转发表条目的现 有反转表超级页面条目在反转表中被标记为无效。然后,处理进行到步骤5815,下文对其描 述。如果对应于现有的转发表条目的反转表时间戳高于(晚于)超级块元数据表时间 戳(步骤5810的“>”结果),则这意味着当前在转发表中的LBA条目取代了超级块元数据 表中的LBA条目(例如,LBA在被写入当前正被评估的超级块中之后再次被写入)。在该情 况中,在步骤5812中,将用于包含当前超级块元数据表中的LBA的超级页面的反转表条目 标记为无效。然后,处理进行到步骤5817,下文对其描述。如果反转表时间戳等于超级块元数据表时间戳(步骤5810的“=”结果),则这意 味着相同的LBA被两次写入相同的超级块中。为了确定哪个被写得更晚,必须读取来自超 级页面元数据的时间戳。在步骤5813中,将来自两个超级页面的时间戳字段1403的内容 从闪存复制到级缓冲器中。在步骤5814中,比较超级页面时间戳。在步骤5811中,在反转表中将两个超级页面的较旧者标记为无效。在LBA在转发表中未准备好(步骤5809的“否”结果)的情况下,或者在步骤5811 之后,到达步骤5815,在步骤5811中,已经在反转表中将旧超级页面标记为无效。在步骤 5815中,将用于新超级页面的闪存地址信息写入对应于LBA的转发表字段中。用于LBA的 转发表条目现在指向存储LBA数据的当前有效版本的超级页面。在步骤5816中,在反转表中将该超级页面标记为有效。
84[1041]在步骤5816之后或步骤5812之后到达步骤5817。在步骤5817中,递增超级页
面。 在步骤5818中,将被递增的超级页面值与63比较。如果新递增的超级页面小于或等于63(步骤5818的“否”结果),则这意味着在当 前子组中还剩余附加的超级页面要被评估,并且处理返回到步骤5809,其中,下一超级页面 的评估开始。注意,超级块元数据表中所列的超级页面从0至63按顺序被评估。如果新递增的超级页面大于63(步骤5818的“是”结果),则这意味着已经到达子 组中的最后一个超级页面。在步骤5819中,递增子组。在步骤5820中,将新递增的子组值与子组的数量(标记为“η”)比较(如以上所 标注的,子组的数量是实施相关的)。如果新递增的子组小于或等于η (步骤5820的“否”结果),则这意味着超级块中 还剩余附加的子组要被检查(如上所述,超级块在每个子组上包括相同的块)。在该情况 中,处理返回到步骤5808,此时,下一子组的超级页面0的评估开始。应该理解,子组被按从 0至η的顺序评估。如果新递增的子组大于η (步骤5820的“是”结果),则这意味着已经到达超级块 中的最后一个块。在步骤5821中,递增超级块。注意,要么从步骤5820要么从步骤5804到达该步 骤,在这两个步骤中,当前超级块被置于超级块空闲列表上。在步骤5822中,将新递增的超级块值与每闪存组的超级块的总数量(标记为“ρ”) 比较(如上所标注的,每闪存组的超级块的数量是实施相关的)。如果新递增的超级块小于或等于ρ (步骤5822的“否”结果),则这意味着该闪存 组中还剩余附加的超级块要被评估。在该情况中,处理返回到步骤5802,此时,用于下一超 级块的超级块元数据表被复制到级缓冲器中,覆写用于在先的超级块的表,并且,处理再次 开始用于新超级块。如果新递增的超级块大于ρ (步骤5822的“是”结果),则已经评估了最后一个超 级块,而且,用于该闪存组的超级块元数据表、转发表和反转表的恢复完成。返回到步骤5805,如果开放和关闭标志的分析指示超级块在掉电时是开放的(设 置了开放标志,未设置关闭标志),则存储在闪存中的用于该超级块的超级块元数据表在确 定哪些LBA已经被分配给该超级块的超级页面时将没有作用,这是因为,当关闭该超级块 时,该信息仅被存储到闪存中。为此原因,必须使用存储在闪存中的超级页面元数据重建超 级块元数据表。一旦该表被重建,便可以接着使用与用于所有其它超级块相同的方法分析 该超级块。在步骤5823中,将当前时间写入超级块元数据表的时间戳字段3506中。虽然该时 间戳不反映关闭超级块的时间(因为超级块在掉电时不关闭),但当前时间被保证晚于用 于任何其它超级块的反转表时间戳的值。因此,如果相同的LBA被写入开放的超级块中与 关闭的超级块中,则用于开放的超级块的时间戳值将晚于用于关闭的超级块的时间戳值, 因此,导致在存储用于LBA的有效内容时接受用于开放的超级块的超级页面。这是正确的 结果,这是因为,开放的超级块中的信息晚于在先关闭的超级块中的信息被定义。注意,在 重建处理完成之后,开放的超级块将保持开放。当关闭超级块时,超级块元数据表时间戳值将在该表被存回到闪存中之前被关闭时间覆写,并因此将是正确的。在步骤5824中,将子组设为0,因此设立通过超级块的所有块(每个子组一个)的 循环。在步骤5825中,将超级页面设为0,因此设立穿过子组中的所有超级页面的循环。在步骤5826中,将用于当前超级页面的超级页面元数据1401从闪存复制到级缓 冲器中。 [1057]在步骤5827中,进行检查,以确定超级页面是否在掉电前被写入。已经被写的超 级页面将包括有效元数据。如果超级页面已被写入(步骤5827的“是”结果),则在步骤5828中,超级页面元 数据被用于填充超级块元数据表中用于该超级页面的条目。S页面索引字段1402被用于超 级块元数据表的LBA字段。时间戳字段1403被用于超级块元数据表的超级页面时间戳字 段。注意,用于该超级页面的超级块元数据缺陷字段已经包含有效信息,这是因为,缺陷信 息被保持在用于擦除的超级块的元数据表的闪存版本中,并因此在用于开放的超级块被从 闪存复制到级缓冲器时是有效的。步骤5829-5832与步骤5817-5820相同地操作。如上所解释,这些步骤控制循环 的处理,并确保每个超级块的每个超级页面被评估。注意,如果当前超级页面未被写入(步骤5827的“否”结果),则处理跳到步骤 5831,此时,递增子组。因为在每个子组上按顺序分配超级块的超级页面,所以,如果子组上 的一超级页面未被写入,则这意味着该子组上随后的超级页面也未被写入。一旦已经评估了超级块元数据表中的最后一个块(步骤5832的“是”结果),用于 该表的重建处理完成,并且处理返回到步骤5806,此时,用于元数据表的时间戳信息被复制 到反转表中,因此确保该超级块中的超级页面在发现与任何其它超级块冲突的情况下始终 被认为是有效的。然后,处理对于该超级块从步骤5806继续。VI. MLC 闪存虽然这里描述的大多数实施例使用SLC闪存,但SSD控制器106很好地适用于MLC 闪存的适用。MLC闪存每个闪存单元存储多个比特,并因此能够存储更大量的数据。MCL还 对每单元存储量具有更低的成本。然而,MLC遭受几个使其难以在高性能、高稳定性应用(诸如数据中心)中使用的 问题。首先,MLC比SLC慢。如上所述,MLC写可能比SLC写多花费100微秒,并且某些MLC
甚至更慢。第二,MLC闪存比SLC倾向具有更短的寿命。一般地,SLC闪存被指定处理100000 个擦除周期而不失败,而目前的MLC闪存技术仅被指定处理10000个擦除周期。第三,MLC闪存比SLC承受更高的数据错误率。SSD控制器106被设计为与MLC闪存一起在非常高性能水平上操作,并且对控制器 软件或硬件具有最小的改变或无改变。首先,如上联系图44所解释,在SSD控制器106中使用的并行流水线掩盖写等待 时间,从而,虽然MLC写比SLC写花费更长的时间,但经过一系列的写,该差别的大部分被掩 盖,这是因为,SSD控制器106可以将写分解为页面大小的组块,并且,以并行和重叠的方式 处理这些组块。[1069]第二,SSD控制器106的闪存结构倾向在相对较大的存储空间中到处移动新写的 数据,由此最小化擦除周期限制的影响,甚至不使用特殊的磨损均衡技术。如上所述,对不 同的超级页面而不是保持现有数据的超级页面进行新的写,并且,新超级页面可以与初始 超级页面在不同的块上。这倾向在闪存组内到处移动数据,从而,如果特定数据元素相对频 繁地被擦除,则这些擦除将横跨大量物理闪存页面分散。在不同的实施例中,SSD控制器106可以使用显性的磨损均衡技术。例如,在识别 要经受垃圾收集的超级块时,SSD控制器106可以优先选择带有在擦除计数字段3507中 (见图35)识别的相对低的擦除计数的超级块。用于每个超级块的擦除计数信息可以以与 时间戳字段3405类似的方式被存储在反转表的行中。SSD控制器106可以使用擦除计数 信息来打破带有相同数量的有效超级页面的超级块之间的垃圾收集平局(见联系图56的 讨论),或者可以使用擦除计数信息将超级块分为多类,具有接近危险区(例如,5000次擦 除)的擦除计数的超级块被优先选择为“垃圾收集”超级块(如上联系图56所述,在一个 实施例中,来自与垃圾收集操作有关的、正被擦除的超级块的有效数据被存储在垃圾收集 超级块中,导致垃圾收集超级块上相对较少的数据无效,从而该超级块的擦除将倾向相对 较不频繁地发生)。类似地,如上所述,可以识别带有超过阈值的擦除计数值的超级块,以便 它们被优先选择用于常规的垃圾收集,由此降低对这种超级块的额外磨损。虽然本发明已被描述的各个方面的实施例是优选实施例,但本领域的技术人员将 理解,它们的变化也是可以的。因此,本发明被给予所附权利要求的全部范围内的保护。
权利要求
一种闪存控制器,包括多个处理器,每个处理器包括寄存器、ALU和内部存储器;多个存储器,所述存储器中的至少一些包含数据结构,所述数据结构包括与存储器命令相关的元数据,所述存储器中的至少一些包含用于所述多个处理器的工作队列;交叉切换器,其将所述处理器与所述存储器连接,所述交叉切换器包括一组处理器端口,其对于每个处理器包括一个端口;以及一组存储器端口,其对于每个存储器包括一个端口;以及内部切换机制,其允许任何处理器端口与任何存储器端口连接,但不允许处理器端口与另一处理器端口连接、或存储器端口与另一存储器端口连接;由此,处理器通过使用所述交叉切换器来在与另一处理器关联的工作队列上放置任务,与另一处理器通信。
2.如权利要求1所述的闪存控制器,还包括仲裁器,其在多于一个处理器寻求对交叉切换器存储器端口的访问的情况下,控制对 所述端口的访问,所述仲裁器控制交叉切换器内部切换电路,以提供对已经赢得仲裁的处 理器的访问。
3.如权利要求1所述的闪存控制器,其中所述工作队列中的至少一个包含指向所述数据结构之一的指针。
4.如权利要求3所述的闪存控制器,其中所述存储器中的至少一个包含指向数据结构的指针,所述数据结构被格式化来存储元 数据,但包括当前未存储有效元数据的一个或多个字段。
5.如权利要求1所述的闪存控制器,其中至少一个工作队列被寄存器组控制,所述寄存器组包括存储信息的第一寄存器,根据 所述信息,可以将空的工作队列与至少包含一个任务的工作队列区分开;并且所述控制器还包括连接到处理器的信号,所述信号由所述第一寄存器控制,所述信号 由空的工作队列与包含任务的工作队列之间的转变触发,所述信号引起所述处理器终止休 眠模式。
6.一种操作闪存控制器的方法,包括以下步骤(a)接收指定读或写以及逻辑地址的主机命令;(b)创建与所述主机命令相关的元数据结构,所述结构指定所述主机命令、以及所述逻 辑地址、或与所述逻辑地址相关的地址;(c)在第一存储器或存储器区域中存储所述元数据结构;(d)第一处理器访问第二存储器或存储器区域,所述第二存储器包含与第二处理器关 联的排序的工作列表;(e)所述第一处理器将指向所述元数据结构的指针写入所述工作列表上;以及(f)作为响应,所述第二处理器执行与所述元数据结构相关的任务。
7.如权利要求6所述的方法,其中步骤(d)还包括所述第一处理器访问交叉切换器,并连接到与所述第二存储器关联 的端口。
8.如权利要求6所述的方法,其中步骤(f)中的第二处理器的任务包括以下子步骤(i)访问所述第一存储器或存储器区域,并且将所述元数据结构复制 到所述第二处理器内部的存储器中。
9.如权利要求8所述的方法,其中步骤(f)中的访问所述第一存储器或存储器区域的动作包括所述第二处理器访问交 叉切换器,并连接到与所述第一存储器或存储器区域关联的端口。
10.如权利要求8所述的方法,其中步骤(f)中的第二处理器的任务包括以下附加子步骤( )在所述元数据结构被存储在所述第二处理器的内部存储器中的同时,修改所述元 数据结构的内容;以及(iii)将修改的元数据结构复制到所述第一存储器中。
11.一种闪存控制器,包括交叉切换器,其将多个处理器与多个存储器连接,所述交叉切换器包括仲裁器,所述仲 裁器基于仲裁的结果分配所述交叉切换器上的存储器端口的控制; 所述多个存储器,其存储多个填充的元数据结构,所述元数据结构与主机命令相关; 指向空闲元数据结构的指针的列表;以及第一和第二工作列表,其各自包含指向填充的元数据结构的指针,每个工作列表与单 独的处理器关联。
12.如权利要求11所述的控制器,还包括第一处理器和第二处理器,每个处理器包括ALU、寄存器和内部处理器存储器,所述第 一处理器的内部处理器存储器存储与第一主机命令相关的第一元数据结构,所述第二处理 器的内部处理器存储器存储第二元数据结构。
13.如权利要求12所述的控制器,其中所述第一工作列表与所述第一处理器关联,所述第二工作列表与所述第二处理器关联;在所述第一工作列表上的指针指向第三元数据结构,所述第三元数据结构被存储在控 制器存储器中,所述第三元数据结构与所述第一元数据结构相关;并且在所述第二工作列表上的指针指向第四元数据结构,所述第四元数据结构被存储在控 制器存储器中,所述第四元数据结构与所述第二元数据结构相关。
14.如权利要求13所述的控制器,其中所述第一元数据结构与所述第二元数据结构是第一类型; 所述第三元数据结构与所述第四元数据结构是第二类型;并且 所述第一元数据结构包含指向所述第三元数据结构的指针,所述第二元数据结构包含 指向所述第四元数据结构的指针。
15.如权利要求14所述的控制器,其中 所述第三元数据结构包含第一逻辑地址; 所述第四元数据结构包含第二逻辑地址;所述第一元数据结构包含与所述第一逻辑地址相关的第一物理地址;并且 所述第二元数据结构包含与所述第二逻辑地址相关的第二物理地址。
16.一种操作闪存控制器的方法,所述闪存控制器包括第一处理器和第二处理器、交叉 切换器、以及第一和第二控制器存储器,所述方法包括以下步骤(a)所述第一处理器在所述第一处理器内部的处理器存储器中存储第一元数据结构;(b)所述第一处理器访问与所述第一控制器存储器关联的第一交叉切换器端口;(c)所述第一处理器将所述第一元数据结构复制到所述第一控制器存储器中;(d)所述第一处理器访问与所述第二控制器存储器关联的第二交叉切换器端口;(e)所述第一处理器将指向所述第一元数据结构的指针放置在被存储在所述第二控制 器存储器中的工作列表中,所述工作列表与所述第二处理器关联;(f)所述第二处理器访问所述第一交叉切换器端口;(g)所述第二处理器将所述第一元数据结构从所述第一控制器存储器复制到所述第二 处理器内部的处理器存储器中;以及(h)所述第二处理器修改所述第一元数据结构。
17.如权利要求16所述的方法,还包括(i)所述第二处理器填充第二元数据结构的字段,所述第二元数据结构位于所述第二 处理器内部的处理器存储器中;以及步骤(h)中的修改包括向所述第一元数据结构加入指向所述第二元数据结构的指针。
18.如权利要求17所述的方法,其中 所述第一元数据结构包括逻辑地址;并且步骤(i)包括将第一物理闪存地址置于第二元数据结构字段中,所述第一物理闪存 地址与所述逻辑地址相关。
19.如权利要求18所述的方法,还包括(j)所述第二处理器填充第三元数据结构的字段,所述第三元数据结构位于所述第二 处理器内部的处理器存储器中;以及步骤(h)中的修改包括向所述第一元数据结构加入指向所述第三元数据结构的指针。
20.如权利要求19所述的方法,其中步骤(j)包括将第二物理闪存地址置于第三元数据结构字段中,所述第二物理闪存 地址与所述逻辑地址相关。
21.—种闪存控制器,包括第一处理器和第二处理器,每个处理器包括寄存器、ALU以及内部处理器存储器; 第一易失性存储器,其包含第一工作列表,所述第一工作列表与所述第一处理器关联;第二易失性存储器,其包含第二工作列表,所述第二工作列表与所述第二处理器关联;第三易失性存储器,其包含与第一主机命令相关的第一元数据结构; 第四易失性存储器,其包含与第二主机命令相关的第二元数据结构; 交叉切换器,其包括各自连接到处理器的一组处理器端口,其包括连接到所述第一处理器的第一处理器端口、以及连接到所述第二处理器的第二处理器端口 ;各自连接到易失性存储器的一组存储器端口,其包括连接到所述第一易失性存储器的 第一存储器端口、连接到所述第二易失性存储器的第二存储器端口、连接到所述第三易失 性存储器的第三存储器端口、以及连接到所述第四易失性存储器的第四存储器端口 ;所述交叉切换器包括内部电路,其选择性地将所述处理器端口之一连接到所述存储器 端□之一。
22.如权利要求21所述的控制器,其中所述第一工作列表包含与所述第一主机命令相关的第一信息,并且,所述第二工作列 表包含与所述第二主机命令相关的第二信息。
23.如权利要求22所述的控制器,其中所述第一信息构成指向所述第一元数据结构的指针;以及所述第二信息构成指向所述第二元数据结构的指针。
24.如权利要求23所述的控制器,其中所述第一工作列表包括指向第三元数据结构的指针,所述第三元数据结构与所述第二 主机命令相关。
25.如权利要求23所述的控制器,其中所述第一元数据结构和所述第二元数据结构包括逻辑地址,但不包括物理地址;并且所述第一处理器的内部处理器存储器包括第四元数据结构,所述第四元数据结构包括 物理地址。
全文摘要
提供了一种设计为与闪存存储模块一起使用的控制器,包括设计来将多个内部处理器与包括多个内部存储器的各种内部资源连接的交叉切换器。存储器包含用于处理器的工作列表。在一个实施例中,处理器通过使用交叉切换器在其它处理器的工作列表上放置任务来通信。
文档编号G06F12/00GK101965559SQ200880127623
公开日2011年2月2日 申请日期2008年12月23日 优先权日2007年12月27日
发明者道格拉斯·普林斯, 阿伦·奥尔布里科 申请人:普莱恩特技术股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1