技术领域
[0001] 本发明涉及存储设备控制器,特别是存储设备控制器中用32位CPU通过MMU(Memory Management Unit)访问大于4GB的内存空间的方法与装置
相关背景技术
[0002] 在固态存储设备(Solid State Drive,SSD)中,利用FTL(Flash Translation Layer,闪存转换层)来维护从逻辑地址到物理地址的映射信息。逻辑地址构成了操作系统等上层软件所感知到的固态存储设备的存储空间。物理地址是用于访问固态存储设备的物理存储单元的地址。在现有技术中还可利用中间地址形态实施地址映射。例如将逻辑地址映射为中间地址,进而将中间地址进一步映射为物理地址。
[0003] 存储了从逻辑地址到物理地址的映射信息的表结构被称为FTL表。FTL表是固态存储设备中的重要元数据。通常FTL表的数据项记录了固态存储设备中以数据页为单位的地址映射关系。固态存储设备的FTL表具有较大的尺寸,例如若干GB级。
[0004] FTL表包括多个FTL表条目(或称表项)。在申请号为201510430174.6的中国专利申请中提供了FTL表结构的示例。在一个例子中,每个FTL表条目中记录了一个逻辑页地址与一个物理页的对应关系。在又一个例子中,每个FTL表条目中记录了逻辑块地址与物理块地址的对应关系。在依然又一个例子中,FTL表中记录逻辑块地址与物理块地址的映射关系,和/或逻辑页地址与物理页地址的映射关系。FTL表条目也可以记录逻辑地址与一个或多个物理地址的映射关系。
[0005] 在依然又一个例子中,在连续的内存地址空间中存储FTL表,每个FTL表条目中记录物理地址,而以每个FTL表条目自身的内存地址代表对应于物理地址的逻辑地址。FTL表条目的数量对应于固态存储设备逻辑地址空间的大小。
[0006] 闪存控制器工作时需要频繁访问FTL。在读取闪存时,通过逻辑地址查询FTL表以获得存储数据的闪存的物理地址。在写入闪存时,为写入的数据分配物理地址,并在FTL中记录写入的逻辑地址与物理地址的对应关系。在发生GC、擦除均衡等操作时,逻辑地址与物理地址的映射关系发生改变,需要更新FTL。
[0007] 已经存在多种访问FTL的技术方案。在中国发明专利申请(CN 201610346104.7)中提供了FTL表快速访问方法与装置,将其通过引用并入本发明。
[0008] FTL表的特点包括表项数量多(常见的SSD中要管理数亿条FTL表项)、每条表项的尺寸小(约几个到十几个字节)、随机性强(对FTL表项的访问分布在整个表项空间而缺乏局部性)。并且由于要支持大容量的FLASH,所以经常需要进行超过4GB的空间的访问。
[0009] 为存储GB级的数据,一般采用DRAM(Dynamic Random Access Memory,动态随机访问存储器)。而DRAM的访问延迟无法匹配CPU(Central Processing Unit,中央处理单元)等高速处理部件,并严重影响闪存控制器的处理性能。传统地,采用Cache(高速缓冲存储器)作为存储中间层,通过缓存DRAM中的部分数据来为CPU提供高速数据访问能力。
[0010] 但是,由于FTL表访问的随机性,即使使用Cache来缓存FTL表,也会由于频繁的换页引起Cache颠簸,并导致FTL访问能力无法显著提升。
[0011] 例如,当访问FTL表项A时,首先读取DRAM中存储表项A的地址,FTL表 项访问的随机性,表项A不太可能已经存在于缓存中,所以可以认为缓存总是缺失,需要将表项A从外部DRAM存储器读取到Cache中,此时延迟惩罚大约在100ns以上。
[0012] 还可以使用DMA来访问FTL。在访问FTL时,需要配置地址的高位、地址的低位,然后通过触发DMA来将FTL搬移到CPU可以直接访问到的(或者低延迟可以访问到)空间上,比如低4G的DDR或者系统的SRAM中。然而,这种方案的缺点也是明显的:配置DMA的过程需要占用时间,并且CPU访问延迟也会比较大。且因为有DMA的参与,还需要考虑存储一致性问题。
[0013] 对于大容量的固态存储设备,FTL表的尺寸可大于4GB。而地址总线和/或数据总线为32位CPU访问超过4GB的内存空间是困难的。
[0014] 而且,当FTL条目的大小变化时,会进一步增大FTL的访问延迟。
具体实施方式
[0059] 图1是根据本发明实施例的电路系统的框图。CPU 110与诸如DRAM的主存储器130耦合在一起,构成电路系统。CPU 110通过内存管理单元(MMU,Memory Management Unit)访问主存储器(130)。CPU向MMU 120提供虚拟地址,而MMU 120将虚拟地址转换为物理地址,并用物理地址访问主存储器130。作为举例,CPU 110提供的虚拟地址为32位,而MMU 120提供的物理地址为40位。物理地址的宽度与主存储器130的大小相关。可选地,MMU 120通过总线140访问主存储器130。依然可选地,MMU 120还耦合到TLB 150(旁路转换缓存,Translation Lookside Buffer)。TLB 150用于缓存虚拟地址与物理地址的对应关系。
[0060] 主存中存储FTL表。主存的存储空间可以是若干GB(吉字节,Giga Byte),FTL表占据的存储空间大于4GB。在根据本发明的实施例中,FTL表的数据结构是已知的,从而依据访问固态存储设备的IO命令所展示的逻辑地址,能够得到FTL表中存储了该逻辑地址的表项的物理地址。在一个例子中,FTL表以平面(Flat)结构存储,记录了逻辑地址L的FTL表的表项存储在物理地址(B+L*8)处,其中B指示FTL表的基地址,而用于每个逻辑地址的FTL表条目占据8字节存储空间。在另一个例子中,FTL表以树形结构存储。树的叶节点记录了FTL表的表项,而非叶节点记录了FTL表表项的索引。CPU 110通过逻辑地址L遍历树形结构,以获得记录逻辑地址L对应的FTL表表项的物理地址。
[0061] 现有技术中,MMU用于将较大的虚拟地址空间转换为较小的物理地址空间,以解决物理存储器容量不足,和/或为多个应用程序提供独占的虚拟存储空间。图2是现有技术的虚拟地址空间到物理地址空间映射的示意图。作为举例,物理存储器提供的物理地址空间为0-2GB,而虚拟地址空间为0-4GB。在运行时,MMU将2GB的虚拟地址空间映射到物理地址空间,而当CPU尝试访问未被映射到物理地址空间的虚拟地址时,将通过缺页中断或其他的机制,将当前物理地址空间的数据存储到外存,并改变虚拟地址空间与物理存储空间的映射关系。使得CPU通过虚拟地址能够访问对应物理地址。
[0062] 图2B是根据本发明实施例的虚拟地址空间到物理地址空间映射的示意图。在根据本发明的实施例中,由主存储器130(参看图1)提供的物理地址空间大于CPU的寻址空间。作为举例,图2B中,CPU可寻址的虚拟地址空间为0-4GB,而主存储器提供的物理地址空间为0-8GB。在运行时,MMU 120(参看图1)将虚拟地址空间映射为物理地址空间的部分(例如4GB大小)。CPU 110还可指示MMU 120改变地址空间映射关系,将虚拟地址空间映射为物理地址空间的其他部分。在图2B中,当前4GB的虚拟地址空间映射到4GB-8GB范围的物理地址空间,当CPU要访问在0-4GB范围的物理地址时,需要先指示MMU 120改变地址空间的映射关系,将当前4GB的虚拟地址空间映射到0-4GB范围的物理地址空间,再以虚拟地址访问MMU 120。
[0063] 有多种虚拟地址空间到物理地址空间的映射方式。例如,基于页的映射。虚拟地址空间可被不连续的物理地址空间提供。
[0064] 作为另一个例子,CPU 110提供32位虚拟地址。MMU 120提供10位基地址寄存器,并将CPU提供的32位虚拟地址与基地址寄存器拼接,得到用于访问主存储器的40位地址。作为另一个例子,MMU 120或者TLB 150提供地址映射表,用于记录32位虚拟地址与40位物理地址的对应关系。CPU 110可访问或设置地址映射表。以及MMU 120从CPU接收到32位虚拟地址后,查找地址映射表,获得40位物理地址,并用40位物理地址访问主存储器(130)。作为举例CPU用8位扩展地址设置MMU的基地址寄存器。作为另一个例子中,CPU更新TLB 150,用32位虚拟地址作为TLB150的索引而用40位物理地址作为与该索引对应的值。在根据本发明的实施例中,每次CPU 110要从主存储器130中获取FTL表的表项前,均更新MMU 120或者判断是否需要更新MMU 120。从而CPU以32位虚拟地址访问MMU 120,而MMU 120以40位物理地址访问主存储器130,并将访问结果提供给CPU 110。
[0065] 在根据本发明的实施例中,当接收到访问固态存储设备的IO命令,从IO命令所指示的逻辑地址,利用已知的FTL表结构,得到记录该逻辑地址的FTL表的表项的物理地址。CPU 110将例如40位的物理地址,拆分为32位的虚拟地址以及8位扩展地址,并用8位扩展地址设置MMU 120,使得MMU 120在接下来接收到32位的虚拟地址时,将32位的虚拟地址与8位的扩展地址组合成40位物理地址,并用40位物理地址访问主存储器130。
[0066] 图3是根据本发明实施例的FTL表项读取过程的流程图。CPU希望使用FTL表项时,通过根据本发明的实施例从主存中获取FTL表项。
[0067] 作为举例,固态存储设备的CPU 110(也参看图1)收到IO命令,获取IO命令要访问的逻辑地址(记为逻辑地址L)(310)。依据逻辑地址L,计算FTL表中存储了对应于逻辑地址L的表项的物理地址(记为物理地址P)(320),作为举例,物理地址P有48位。若固态存储设备中以平面(Flat)结构存储FLT表,记录了逻辑地址L的FTL表的表项存储在物理地址(B+L*8)处,其中B指示FTL表的基地址,而用于每个逻辑地址的FTL表条目占据8字节存储空间。CPU 110用计算得到的物理 地址P设置MMU 120(330)。例如,将48位物理地址P的高16位填充MMU
120的基地址寄存器,使得接下来用虚拟地址(物理地址P的低32位)访问MMU 120时,MMU
120将16位基地址寄存器与32位地址拼接,形成48位物理地址,并访问主存储器。在另一个例子中,CPU将48位物理地址P的低32位作为索引,而将48位物理地址地址作为值,将索引与值的数据对填充到MMU 120或TLB 150提供的地址映射表中,使得接下来用32位虚拟地址(物理地址P的低32位)访问MMU 120时,通过以32位地址作为索引查询地址映射表,MMU 120得到48位物理地址,并用于访问主存储器130。作为依然另一个例子,CPU将逻辑地址L作为索引,而将物理地址P作为值,并用索引与值的数据对设置MMU 120,使得接下来MMU 120收到CPU发出的32位虚拟地址(逻辑地址L)时,查找到物理地址P,并用物理地址P访问主存储器。
[0068] MMU 120记录CPU 110设置的虚拟地址与物理地址的映射关系(335),并向CPU 110指示地址映射关系设置完成。在MMU 120完成对虚拟地址与物理地址的映射关系设置后,CPU 120使用32位的虚拟地址访问MMU(340)。MMU将32位的虚拟地址转换为48位的物理地址,以物理地址访问主存储器(345),并将主存储器返回的结果提供给CPU。
[0069] 在根据本发明的一个实施方式中,对于每次FTL表访问操作,CPU都依据计算出的FTL表的表项的物理地址,设置MMU,使得在CPU接下来对MMU的访问中,能够通过32位虚拟地址,使MMU生成例如48位的物理地址来访问主存储器。在另一个实施方式中,在内存页或树形结构的叶节点中存储FTL表项,每页内存容纳例如FTL表的1000个的表项,对于同一页内的FTL表表项,可以仅设置一次MMU。
[0070] 可选地,在CPU执行图3的步骤330与步骤340之间,或步骤340之后,可执行其他指令,以在MMU 120设置地址映射关系或访问主存储器时,处理其他任务。
[0071] 显然,所属领域技术人员将意识到,在上面的例子中,虚拟地址为32位,而物理地址为40或48位仅是出于举例的目的。虚拟地址与物理地址均可以采用不同的宽度。在根据本发明的实施例中,物理地址的位宽大于虚拟地址的位宽。
[0072] 图3中,CPU执行的步骤由在CPU中运行的软件或固件控制CPU实施,而MMU执行的步骤由MMU的硬件电路实施。
[0073] 除了访问FTL表,根据本发明实施例可以访问在主存储器中存储的任意数据。在依然另一个例子中,在MMU的地址映射表中包括多个条目,每个条目记录虚拟地址与物理地址的对应关系。将MMU的地址映射表的多个条目指派给CPU的多个任务,例如,访问FTL表的任务、执行DMA传输的任务、对IO命令实施调度的任务等,使得每个CPU任务拥有专属的MMU的地址映射表的条目,以及每个CPU任务在使用MMU时设置自己所拥有的MMU的地址映射表条目。
[0074] 在根据本发明的又一个实施例中,将MMU生成的物理地址提供给FTL加速电路,以高效地访问FTL表的表项。
[0075] 图4是根据本发明又一实施例的电路系统的框图。CPU 110与诸如DRAM的主存储器130耦合在一起,构成电路系统。在CPU 110与主存储器130之间设置FTL加速电路410。FTL加速电路410耦合到CPU 110。CPU 110通过高速本地接口访问FTL加速电路410。例如,CPU 110以寄存器访问方式访问FTL加速电路410。CPU 110访问FTL加速电路410时,FTL加速电路410可在一个指令执行周期内向CPU 110提供结果。CPU 110还耦合到MMU 420。MMU 420将例如
32位的虚拟地址,转换为例如40位的物理地址。CPU 110可设置MMU 420的地址转换模式。可选地,MMU 420还耦合到TLB 450。
[0076] FTL加速电路410通过总线耦合到主存储器(例如DRAM)(130)。主存储器130 中存储FTL表。主存储器130的存储空间可以是若干GB,FTL表占据的存储空间可以大于4GB。在根据图4的实施例中,CPU 110向FTL加速电路410提供例如32位的虚拟地址,FTL加速电路410利用MMU 420将虚拟地址转换为例如40位的物理地址,并用物理地址访问主存储器130中存储的FTL表。
[0077] CPU 110通过FTL加速电路410访问主存储器130中存储的FTL表。可选地,CPU 110还可直接访问主存储器,而无需利用FTL加速电路410。CPU 110也可通过MMU 420访问主存储器。可选地,CPU 110通过FTL加速电路410访问主存储器中存储的FTL表,以及CPU 110直接访问主存储器130以获得主存储器130中存储的FTL表之外的其他内容。
[0078] 图5是根据本发明又一实施例的FTL加速电路的框图。FTL加速电路410包括FTL表项存储部件。FTL表项存储部件包括FTL表项地址存储部件520与FTL表项数据存储部件530,分别用于存储FTL表项的地址(例如,FTL表项在主存储器中的存储地址)以及与地址相对应的FTL表项的数据。
[0079] 在FTL加速电路410中,可存储多个FTL表项。FTL表项可以是例如{FTL表项地址,FTL表项数据}。并且,通过索引,CPU 110(参看图4)可显式访问FTL加速电路410的FTL表项地址存储部件520和/或FTL表项数据存储部件530。
[0080] 在另一个例子中,在FTL加速电路410中还与FTL表项相关联地存储FTL表项的长度。从而FTL表项地址指示FTL表项在主存储器130中的起始地址,而FTL表项长度指示FTL表项占据主存储器130空间的大小。
[0081] FTL加速电路410还包括CPU接口510。CPU 110通过CPU接口510访问FTL加速电路410。CPU接口510是低延迟访问接口,支持同步/异步操作模式。在同步操作模式中,CPU 110通过FTL加速电路410的CPU接口510向FTL加速电路410发出访问请求,FTL加速电路410得到访问结果后才向CPU 110指示访问请求处理完成,并向CPU 110提供访问结果,CPU 110得到FTL加速电路410提供的访问结果后,得以继续执行后续操作(例如执行下一条指令)。在异步操作模式,CPU 110通过CPU接口510向FTL加速电路410发出访问请求,FTL加速电路410不等待得到返回结果,就向CPU 110指示访问请求处理完成。
[0082] FTL加速电路410通过MMU 420访问主存储器(例如,DDR存储器)130(也参看图4)。CPU接口510从CPU 110接收访问FTL表的地址,诸如虚拟地址或32位的地址,通过MMU 420将从CPU 110接收的访问FTL表的地址转换为诸如40位的物理地址。以及还将MMU 420生成的物理地址存储在FTL表项地址存储部件520中。CPU 110还可设置MMU 420的地址转换模式,和/或虚拟地址与物理地址的映射关系,使得MMU 420在接下来接收到虚拟地址时,将虚拟地址转换为物理地址,并用物理地址访问主存储器130。
[0083] FTL加速电路410的CPU接口510提供多种访问方式。
[0084] (1)FTL表项预加载(FTL_Prefetch(index,addr))
[0085] CPU 110通过CPU接口510向FTL加速电路410发出FTL表项预加载请求(FTL_Prefetch)来请求FTL加速电路410从主存储器130中加载指定虚拟地址(例如,由addr所指示的地址)的FTL表项A,MMU 420将虚拟地址转换为物理地址,将FTL表项A的物理地址存储在FTL加速电路410的FTL表项地址存储部件520中,将表项A的FTL表项数据存储在FTL加速电路410的FTL表项数据存储部件530中。在CPU 110发送给FTL加速电路410的预加载请求中还包括索引(Index),索引(Index)指示了将FTL表项加载到FTL表项存储部件的哪个位置。通过索引(Index),CPU还可从FTL加速电路410中获取表项A的表项地址和/或表项数据。由于访问主存的时间远大于CPU指令执行时间,为避免CPU 110长时间等待FTL加速电路410的执 行结果,优选地,使用异步操作模式处理该访问请求。
[0086] 可选地,在CPU 110发送给FTL加速电路410的预加载请求中包括多个地址。FTL加速电路410指示MMU 420将多个地址拼接为用于主存储器130的地址。例如,多个地址分别是高位地址与低位地址,多个地址还可以分别是页地址与页内偏移地址。依然可选地,CPU 110发送给FTL加速电路410的预加载请求中使用IO命令的逻辑地址,而FTL加速电路410依据IO命令的逻辑地址计算该逻辑地址对应的FTL表项在主存储器中的物理地址,并在MMU
420中记录逻辑地址与物理地址的映射关系,使得用逻辑地址访问MMU 420,MMY420将依据物理地址访问主存储器130。
[0087] FTL加速电路410收到该预加载请求后,使MMU 420用主存储器地址从主存储器读取指定长度的数据,以获取FTL表项A,并将表项A的表项数据存储在FTL加速电路410的由索引Index索引的表项数据存储部件530中。FTL加速电路还将由MMU 420得到的表项A的主存储器地址存储在FTL加速电路的由索引Index索引的表项地址存储部件520中。
[0088] 可选地,FTL加速电路410从主存储器读取FTL表项数据时,还对主存中的FTL表项数据加锁。在CPU 110发出的FTL表项预加载请求中,还指示是否对主存中的FTL表项数据加锁。
[0089] 可选地,FTL表项预加载请求中指示要加载的FTL表项A的逻辑地址。FTL加速电路410根据逻辑地址确定在主存储器中存储FTL表项A的主存储器地址。例如,通过FTL表基地址与作为偏移值的逻辑地址,确定存储FTL表项A的主存储器地址。或者,以逻辑地址作为索引,查找存储FTL表项A的主存储器地址。以及FTL加速电路410使用FTL表项A的主存储器地址访问主存储器130。
[0090] 可选地,若FTL表项预加载请求中指示了索引index,而在FTL加速电路410的FTL表项存储部件中由索引index所指示的存储单元已经被分配(已存储了FTL表项或已向主存储器130请求加载将存储在由索引index所指示的存储单元的FTL表项),还将由索引index所指示的存储单元的内容清空或标记无效,并重新从主存储器130获取FTL表项。
[0091] (2)FTL表项读(FTL_Read_item(Index))
[0092] CPU 110通过CPU接口510向FTL加速电路410发出FTL表项读请求。在FTL表项读请求中,指定要读取的FTL表项在FTL表项存储部件中的索引(index)。CPU 110通过索引Index请求FTL加速电路410提供对应的FTL表项A。FTL加速电路410依据索引Index从FTL表项数据存储部件530中获得表项数据,并提供给CPU 110。FTL加速电路410将表项数据提供给CPU 110所需的时间接近于CPU指令执行时间,因而优选地,使用同步操作模式处理该访问请求。
若CPU 110通过索引Index请求FTL加速电路410提供对应的FTL表项A的表项数据时,FTL加速电路410的FTL表项存储部件中不存在所请求的表项数据,FTL加速电路410检查是否已向主存储器130发出获取指定主存储器地址的FTL表项A的请求。若请求已发出,则等待主存储器130返回FTL表项A,将FTL表项A存储在FTL表项存储部件中,并将表项A提供给CPU 110。若请求尚未发出,则告知CPU 110所请求的FTL表项A在FTL加速部件410中不存在。
[0093] (3)FTL表项地址读(FTL_Read_addr(Index))
[0094] CPU 110通过CPU接口510向FTL加速电路410发出FTL表项地址读请求。CPU 110通过索引(Index)请求FTL加速电路410提供对应的FTL表项A的表项地址。FTL加速电路410依据索引Index从内部的FTL表项地址存储部件520中获得表项地址,并提供给CPU 110。FTL加速电路410将表项地址提供给CPU 110所需的时间接近于CPU指令执行时间,因而优选地,使用同步操作模式处理该访问请求。若CPU 110通过索引Index请求FTL加速电路410提供对应的FTL表项A的表项地址时,FTL加速电路410的FTL表项地址存储部件520中不存在所请求的表项地址,则告知CPU 110所请求的FTL表项A在FTL加速部件410中不存在。
[0095] 对FTL加速电路410中存储的FTL表项地址的读取操作不是必须的。通常情况下CPU 110更新FTL表项时,仅更新表项数据而无需更新FTL表项地址,从而CPU 110也无需更新FTL加速电路410中存储的FTL表项地址。
[0096] (4)FTL表项更新(FTL_Write_item(index,item))
[0097] CPU 110通过CPU接口510向FTL加速电路410发出FTL表项更新请求。CPU 110请求FTL加速电路410将索引为Index的FTL表项数据更新为CPU 110指定的新表项数据(item)。FTL加速电路410执行对FTL表项数据存储部件520中的表项数据的更新。FTL加速电路410更新表项数据所需的时间接近于CPU指令执行时间,因而优选地,使用同步操作模式处理该访问请求。可选地,若CPU 110通过索引Index请求FTL加速电路410更新对应的FTL表项数据时,FTL加速电路410的FTL表项数据存储部件520中不存在索引为Index的表项数据,则在将新表项数据存储在FTL表项数据存储部件520中。以及可选地,告知CPU 110在FTL加速电路
410的FTL表项数据存储部件520中不存在索引为Index的表项数据。
[0098] 可选地,在CPU 110发出的FTL表项更新请求中,还指示是否对主存储器中的FTL表项数据解锁。FTL加速电路4110向主存储器更新FTL表项数据时,还依据指示对主存储器中的FTL表项数据解锁。从而,CPU 110在需要连续更新FTL表项数据时,可以仅在最后一次更新时,解锁主存中的FTL表项数据。
[0099] (5)FTL表项地址更新(FTL_Write_addr(index,addr))
[0100] CPU 110通过CPU接口510向FTL加速电路410发出FTL表项地址更新请求。CPU 110请求FTL加速电路410将FTL表项地址存储部件520中的索引为Index的FTL表项地址更新为CPU 110指定的与虚拟地址(addr)对应的新表项物理地址。在一个例子中,FTL加速电路410用虚拟地址(addr)访问MMU 420,并用MMU 420提供的与虚拟地址(addr)对应的物理地址更新FTL表项地址存储部件520中的表项地址。可选地,若CPU 110通过索引Index请求FTL加速电路410更新对应的FTL表项地址时,FTL加速电路410的FTL表项地址存储部件520中不存在索引为Index的表项地址,则将新表项地址存储在FTL表项地址存储部件520中。以及可选地,FTL加速电路410告知CPU 110在FTL加速电路410的FTL表项地址存储部件520中不存在索引为Index的表项地址。在另一个例子中,CPU 110通过CPU接口510提供的地址(addr)为物理地址,FTL加速部件410将物理地址(addr)存储在FTL表项地址存储部件520中。
[0101] 对FTL加速电路410中存储的FTL表项地址的更新操作不是必须的。
[0102] (6)FTL表项刷写(FTL_Flush_entry(index),FTL_Flush_entry)
[0103] CPU 110通过CPU接口510向FTL加速电路410发出FTL表项刷写请求。CPU 110请求FTL加速电路410将由Index索引的FTL表项A写入主存储器130。FTL加速电路410依据索引Index从FTL表项地址存储部件520中获得FTL表项A的主存储器地址(物理地址),从FTL表项数据存储部件530中获得FTL表项数据(表项A),并依据主存储器地址将表项A写入到主存储器130。由于访问主存的时间远大于CPU指令执行时间,为避免CPU 110长时间等待FTL加速电路410的执行结果,优选地,使用异步操作模式处理该访问请求。
[0104] 可选地,FTL表项刷写请求中不提供参数,FTL加速电路410响应于不带参数的FTL表项刷写请求而将FTL表项存储部件中的所有FTL表项都写入主存储器130。将FTL表项数据存储部件530中存储的FTL表项数据按FTL表项地址存储部件520 中存储的对应的FTL表项地址写入主存储器130。
[0105] 可选地,在CPU 110发出的FTL表项刷写请求中,还指示是否对主存储器中的FTL表项数据解锁。
[0106] (7)FTL表项透写(FTL_WriteThrough_item(index,item))
[0107] CPU 110通过CPU接口510向FTL加速电路410发出FTL表项透写请求。CPU 110请求FTL加速电路410将FTL表项数据存储单元530索引为Index的FTL表项数据更新为CPU 110指定的新表项数据,并将新表项数据写入主存储器130。FTL加速电路410执行对FTL表项数据存储部件530中的表项数据的更新。FTL加速电路410还主动发起主存储器更新请求,依据索引(index)从FTL表项地址存储部件520中取得主存储器地址(物理地址),并依据主存储器地址将由索引(index)所指示的FTL表项数据写入主存储器130,而无需CPU 110干预。
[0108] 由于将数据写入主存储器130的操作耗时较多,优选地,使用异步操作模式处理该访问请求,在FTL加速电路410将FTL表项数据写入FTL表项数据存储单元530后即向CPU 110指示FTL表项透写请求处理完成。
[0109] 操作流程
[0110] (1)读取FTL表项
[0111] 图6是根据本发明又一实施例的FTL表项读取过程的流程图。
[0112] 作为举例,固态存储设备的CPU 110(也参看图1)收到IO命令,获取IO命令要访问的逻辑地址(记为逻辑地址L)(610)。CPU 110希望从主存储器130中获取记录了逻辑地址L的FTL表项A。依据逻辑地址L,计算FTL表中存储了对应于逻辑地址L的表项的物理地址(记为物理地址P)(620)。CPU 110用计算得到的物理地址P设置FTL加速电路410的MMU 420(也参看图4或图5)(630),使得通过MMU 420能够提供虚拟地址addr与物理地址P的对应关系。MMU 420记录CPU 110设置的虚拟地址addr与物理地址P的映射关系(635),并向CPU 110指示地址映射关系设置完成。
[0113] CPU 110通过读请求的逻辑地址,确定要加载虚拟地址addr处的FTL表项A。CPU通过FTL加速电路410的CPU接口510请求FTL加速电路410预加载FTL表项A(例如FTL_Prefetch(index,addr))(640)。为请求FTL加速电路410预加载FTL表项A,CPU 110还告知FTL加速电路410用于索引FTL表项A的索引(index),从而在FTL加速电路410加载了FTL表项A后,CPU 110通过索引index可从FTL加速电路410快速获取FTL表项A。FTL加速电路410会将获取到的FTL表项A存储在由索引(index)寻址的FTL表项数据存储部件530与FTL表项地址存储部件
520中。
[0114] CPU 110请求FTL加速电路410预加载FTL表项A的操作,以异步方式执行。CPU 110发出该请求后,无需等待FTL加速电路410返回执行结果,而继续执行其他处理(650)。从而在FTL加速电路410从主存储器(例如DRAM)读取FTL表项A的过程中,CPU 110的处理能力能得到有效利用。
[0115] FTL加速电路410响应于CPU 110发出的预加载FTL表项A的请求,使用地址addr作为虚拟地址访问MMU 420,MMU 420将虚拟地址addr转换为物理地址,并用物理地址从主存储器130读取数据,作为FTL表项A(635)。FTL加速电路410以异步方式响应CPU 110发出的预加载FTL表项A的请求,在收到FTL表项A预加载请求后,从主存储器获得FTL表项A之前,即向CPU 110指示预加载请求处理完成。
[0116] 在一个例子中,CPU 110还告知FTL加速电路410所请求的FTL表项A的长度,从而MMU 420从主存储器中读取指定长度的数据。可选地,CPU 110还指示FTL加 速电路410对所请求的FTL表项A加锁,而MMU 420从主存储器获取FTL表项A时,首先请求为FTL表项A加锁,在成功加锁后,从主存储器130读取FTL表项A。
[0117] 一段时间后,CPU 110估计FTL加速电路410已经从主存储器130取回了FTL表项A。CPU 110通过FTL加速电路410的CPU接口510从FTL加速电路410读取(例如FTL_Read_item)索引为index的FTL表项A(660)。在另一个例子中,FTL加速电路410向CPU 110发送消息或中断,以指示CPU 110已经从主存储器130取回了FTL表项。
[0118] 在下图的例子中,在CPU 110从FTL加速电路410读取索引为index的FTL表项A时,FTL加速电路410已经从主存储器获得了FTL表项A,并存储在FTL加速电路410的FTL表项数据存储部件530中,FTL加速电路410还将表项A的主存储器地址存储在FTL表项地址存储部件520中,以及在FTL加速电路410中存储的FTL表项A以及表项A的地址可通过索引index访问。
[0119] 响应于CPU 110从FTL加速电路410读取索引为index的FTL表项A,FTL加速电路410从FTL表项数据存储部件530中获取表项A并向CPU 110提供(665)。CPU 110从FTL加速电路410读取索引为index的FTL表项A的操作,以同步方式执行。在CPU 110收到FTL加速电路410提供的表项A后,才继续执行其他操作(例如,使用FTL表项A的操作)。
[0120] 在另一个例子中,在CPU 110从FTL加速电路410读取索引为index的FTL表项A前,FTL加速电路410已经收到了从主存储器130预加载FTL表项A的请求,但尚未从主存储器获得FTL表项A。由于以同步方式执行从FTL加速电路410读取索引为index的FTL表项A的操作,FTL加速电路410等待从主存储器130获得FTL表项A后,将表项A存储在FTL加速电路的FTL表项数据存储部件520中,并向CPU110提供FTL表项A。
[0121] 在依然另一个例子中,在CPU 110从FTL加速电路410读取索引为index的FTL表项A时,FTL加速电路410尚未收到从主存储器预加载FTL表项A的请求。FTL加速电路410检查是否已向主存储器发出预加载指定主存储器地址的FTL表项A的请求;若请求尚未发出,则告知CPU 110所请求的FTL表项A在FTL加速部件410中不存在。
[0122] 在另一个实施例中,为充分利用FTL加速电路410的预加载能力,CPU 110向FTL加速电路410发出多个预加载请求,以请求FTL加速电路410预加载多个(例如m个,m是正整数)FTL表项。在发出m个预加载请求后,最初请求预加载的FTL表项A已经被FTL加速电路410从主存储器130取回,从而CPU 110紧接着发出FTL表项读请求,FTL加速电路410能够立刻向CPU提供所读取的FTL表项A。
[0123] (2)更新FTL表项(图7A)
[0124] 在处理一些IO命令(例如写命令)时,需要为逻辑地址分配新的对应物理地址,并更新FTL表项(例如表项A)。图7A展示了根据本发明又一实施例更新FTL表项的流程。
[0125] 为更新FTL表项A,CPU 110通过根据本发明的实施例从主存储器中获取FTL表项A,并存储在FTL加速电路410的FTL表项数据存储部件530中。
[0126] 接下来,CPU 110为FTL表项A分配了新的物理地址(用于该写命令的固态存储设备的物理地址)。为将更新了物理地址的FTL表项A写入主存储器,CPU 110通过FTL加速电路410的CPU接口510向FTL加速电路410写入索引为index的FTL表项A(表项A中包含新分配的用于该写命令的固态存储设备的物理地址)(710)。响应于CPU 110向FTL加速电路410写入(FTL_Write_item(index,item))索引为index的FTL表项A,FTL加速电路410在FTL表项数据存储部件530中更新索引为index 的表项数据(715)。CPU 110向FTL加速电路410写入索引为index的FTL表项A的操作,以同步方式执行。
[0127] 接下来CPU可以执行其他处理(720)。
[0128] 在一个例子中,CPU 110还通过FTL加速电路410的CPU接口510请求FTL加速电路410将索引为index的FTL表项刷写到主存储器(FTL_Flush_entry(index))。响应于CPU 110请求FTL加速电路410将索引为index的FTL表项刷写到主存储器130,FTL加速电路410基于表项A的索引index,从FTL表项地址存储部件520获取表项A的主存储器地址,从FTL表项数据存储部件530获取表项A的内容,并通过MMU420或直接向主存储器130发出写请求。CPU
110请求FTL加速电路410将索引为index的FTL表项刷写到主存储器的操作,可以以异步方式执行,使得FTL加速电路410向主存储器130刷写FTL表项的过程中,CPU 110可以执行其他处理。CPU 110请求FTL加速电路410将索引为index的FTL表项刷写到主存储器的操作,也可以同步方式执行,在FTL加速电路410将FTL表项刷写到主存储器后,才向CPU 110指示FTL表项刷写请求完成。可选地,FTL加速电路410组合多个FTL表项,并在一次主存储器更新请求中将多个FTL表项写入主存储器。
[0129] 在另一个例子中,CPU还通过FTL加速电路CPU接口请求FTL加速电路将所有“脏”的FTL表项刷写到主存(FTL_Flush_entry)。“脏”的FTL表项指已被加载到FTL表项存储部件中、已被更新但尚未被刷写到主存中的FTL表项。
[0130] 可选地,FTL加速电路410还为FTL表项存储部件的每个条目维护状态,包括指示未加载FTL标目的空状态,已收到FTL条目加载请求但尚未收到FTL条目的“预加载”状态,已加载FTL条目且FTL条目未被更新的有效状态,FTL条目已被更新的“脏”状态等。
[0131] 可选地,CPU 110还指示FTL加速电路410对所更新的FTL表项A解锁。FTL加速电路410向主存储器更新FTL表项A时,一并将主存储器中的FTL表项A解锁。
[0132] 在另一个实施例中,CPU 110生成新的FTL表项而不是从主存储器130中获取FTL表项。CPU 110通过FTL加速电路410的CPU接口510向FTL加速电路410发出FTL表项更新(FTL_Write_item(index,item))请求,以将生成的FTL表项写入FTL加速电路410由索引index指示的FTL表项存储部件。
[0133] 图7B展示了根据本发明又一实施例更新FTL表项的流程。
[0134] 为更新FTL表项A,CPU 110通过根据本发明的实施例从主存储器130中获取FTL表项A,并为FTL表项A分配了新的物理地址(用于该写命令的固态存储设备的物理地址)。为将更新了物理地址的FTL表项A写入主存储器130,CPU 110通过FTL加速电路410的CPU接口510向FTL加速电路发出索引为index的FTL表项A(包含新分配的物理地址)透写请求(FTL_WriteThrough_item(intel,item))。响应于CPU110向FTL加速电路410发出FTL表项A透写请求,FTL加速电路410在FTL表项数据存储部件530中更新索引为index的表项数据。FTL加速电路410还依据索引index从FTL表项地址存储部件520中取得主存地址,并通过MMU 420或直接向主存储器130发出写请求,而无需CPU 110干预。CPU 110向FTL加速电路410透写索引为index的FTL表项A的操作,以异步方式执行。使得FTL加速电路410更新FTL表项存储部件并将新表项数据写入主存储器130的过程中,CPU 110能够执行其他处理(420)。
[0135] 可选地,FTL加速电路410组合多个FTL表项,并在一次主存储器更新请求中将多个FTL表项写入主存储器。
[0136] 可选地,在发出FTL表项透写请求后,CPU 110还通过FTL加速电路410的CPU接口510请求FTL加速电路410将索引为index的FTL表项刷写到主存储器(FTL_Flush_entry(index))。FTL加速电路410收到FTL表项刷写请求后,检查FTL表 项存储单元中索引为index的FTL表项,若该FTL表项已被写入主存储器,则直接向CPU 110指示FTL表项刷写请求完成;若该FTL表项尚未被写入主存储器,则等待将该FTL表项写入主存储器后才向CPU 110指示FTL表项刷写请求完成。
[0137] 应该理解,框图和流程图的每个框以及框图和流程图的框的组合可以分别由包括计算机程序指令的各种装置来实施。这些计算机程序指令可以加载到通用计算机、专用计算机或其他可编程数据控制设备上以产生机器,从而在计算机或其他可编程数据控制设备上执行的指令创建了用于实现一个或多个流程图框中指定的功能的装置。
[0138] 这些计算机程序指令还可以存储在可以引导计算机或其他可编程数据控制设备的计算机可读存储器中从而以特定方式起作用,从而能够利用存储在计算机可读存储器中的指令来制造包括用于实现一个或多个流程图框中所指定功能的计算机可读指令的制品。计算机程序指令还可以加载到计算机或其他可编程数据控制设备上以使得在计算机或其他可编程数据控制设备上执行一系列的操作操作,从而产生计算机实现的过程,进而在计算机或其他可编程数据控制设备上执行的指令提供了用于实现一个或多个流程图框中所指定功能的操作。
[0139] 因而,框图和流程图的框支持用于执行指定功能的装置的组合、用于执行指定功能的操作的组合和用于执行指定功能的程序指令装置的组合。还应该理解,框图和流程图的每个框以及框图和流程图的框的组合可以由执行指定功能或操作的、基于硬件的专用计算机系统实现,或由专用硬件和计算机指令的组合实现。
[0140] 虽然当前发明参考的示例被描述,其只是为了解释的目的而不是对本发明的限制,对实施方式的改变,增加和/或删除可以被做出而不脱离本发明的范围。
[0141] 这些实施方式所涉及的、从上面描述和相关联的附图中呈现的教导获益的领域中的技术人员将认识到这里记载的本发明的很多修改和其他实施方式。因此,应该理解,本发明不限于公开的具体实施方式,旨在将修改和其他实施方式包括在所附权利要求书的范围内。尽管在这里采用了特定的术语,但是仅在一般意义和描述意义上使用它们并且不是为了限制的目的而使用。