闪存控制器、闪存控制器的方法及记忆装置
技术领域
本申请关于一种记忆装置,特别有关于一种闪存控制器、相应的记忆装置以及应用于闪存控制器的方法。
背景技术
传统上,当一主机想要通过一闪存控制器写入数据至一闪存模块时,该主机会发送该数据至该闪存控制器,该数据会暂时储存在该闪存控制器内部的一快取或一缓冲器,而当暂存于该快取的数据量达到一预定值时该数据就会被写入至该闪存模块,例如,该闪存控制器会从该主机连续地接收数据并储存所接收的数据至该快取,而当所接收数据的数据量是足够被写入至该闪存模块的多个字线时,该闪存控制器才会从该快取开始搬移数据至该闪存模块。
由于该闪存控制器中的快取可暂时储存还没有被写入至该闪存模块的数据,因此当该主机突然想要读取该笔数据时,该闪存控制器可以直接将该快取中储存的数据发送给该主机以缩短存取的时间。详细来说,该闪存控制器的该快取中所储存的每一笔数据均包含有一相应的逻辑地址,而当该主机发送包含一特定逻辑地址的一读取命令时,该闪存控制器将会搜寻该快取中所暂存的多笔数据的多笔逻辑地址,以决定是否该些逻辑地址中是否至少有一笔是符合该特定逻辑地址的,而如果该快取中具有相应于该特定逻辑地址的数据,则该闪存控制器可以直接发送该笔数据至该主机。
然而,如果相应于该特定逻辑地址的数据在一短时间中被更新了,也就是说,该主机在短时间内传送了相应于相同特定逻辑地址的两笔或多笔数据,则该闪存控制器的该快取中会有两笔或多笔数据均相应于该特定逻辑地址,其中具有该特定逻辑地址的最新一笔数据是有效数据,而具有该特定逻辑地址的较早的数据会是无效数据。因此,为了确保该闪存控制器能够发送有效数据至该主机,当该主机发送包含该特定逻辑地址的该读取命令时,该闪存控制器必然需要去搜寻该快取中所暂存的所有数据的所有逻辑地址,而此将导致该闪存控制器是无效率的。此外,由于一个逻辑地址可能会对应于该快取中的两笔或多笔的数据,因此传统的二分搜寻法也不适用于闪存控制器。
发明内容
因此本申请的目的之一在于提供一种闪存控制器,当该闪存控制器的该快取储存从该主机过来的数据时,该闪存控制器能够产生一份基于主机的快取数据或一份基于闪存的快取信息并以具有较少节点的方式来建立与优化一个二叉树,以大幅增进二叉树的搜寻速度、减少该闪存控制器中的多个核心的计算成本以及最小化存取该快取的次数(该快取例如可以是一个动态随机存取内存)来大幅降低总时间延迟,以解决上述的难题。
根据本申请实施例,公开了一种闪存控制器。闪存控制器包含有一接口电路、一只读存储器、一控制逻辑电路、一处理器以及一快取。接口电路耦接于一主机与一内部总线之间。只读存储器耦接至该内部总线,并用来储存一程序代码。控制逻辑电路耦接于该内部总线与一闪存模块之间,该闪存模块外部耦接于该闪存控制器。处理器耦接至该内部总线,并用来执行该程序代码以通过使用该控制逻辑电路来对该闪存模块进行存取。快取耦接至该内部总线。该闪存模块包含有多个芯片,每一芯片包含有多个储存页,每一储存页包含有多个储存区段。当该处理器从该主机通过该接口电路与该内部总线接收到一特定写入命令以及具有N个储存区段的数据量的特定数据时,该处理器用来将该特定数据储存至该快取的一区域,以及该处理器通过加入一特定节点至一二叉树来建立或更新该二叉树,其中该特定节点具有一节点信息,该节点信息包含有一节点索引、由该特定写入命令所携带的一逻辑地址、该快取的该区域所相应的一快取索引、一左节点、一右节点以及该N个储存区段的数据量所相应的一储存区段长度。当该处理器从该主机接收到一读取命令要求读取该快取中所缓存的某一数据时,该处理器被安排用来使用该二叉树中所记录的一或多个节点的节点信息来从该快取中得到该某一数据以及发送该某一数据至该主机而无需控制该控制逻辑电路来对该闪存模块进行存取。
根据本申请实施例,公开了一种记忆装置。该记忆装置包含有上述的闪存模块与闪存控制器。
根据本申请实施例,公开了一种闪存控制器的方法。该方法包含:提供耦接于一主机与一内部总线之间的一接口电路;提供耦接于该内部总线与一闪存模块之间的一控制逻辑电路,该闪存模块外部耦接于该闪存控制器,该闪存模块具有多个芯片,每一芯片包含有多个储存页,每一储存页包含有多个储存区段;提供耦接于该内部总线的一快取;当从该主机通过该接口电路与该内部总线接收到一特定写入命令以及具有N个储存区段的数据量的特定数据时,将该特定数据储存至该快取的一区域以及通过加入一特定节点至一二叉树来建立或更新该二叉树,其中该特定节点具有一节点信息,该节点信息包含有一节点索引、由该特定写入命令所携带的一逻辑地址、该快取的该区域所相应的一快取索引、一左节点、一右节点以及该N个储存区段的数据量所相应的一储存区段长度;以及,当从该主机接收到一读取命令要求读取该快取中所缓存的某一数据时,使用该二叉树中所记录的一或多个节点的节点信息来从该快取中得到该某一数据以及发送该某一数据至该主机而无需控制该控制逻辑电路来对该闪存模块进行存取。
根据本申请实施例,公开了一种闪存控制器。闪存控制器包含有一接口电路、一只读存储器、一控制逻辑电路、一处理器以及一快取。接口电路耦接于一主机与一内部总线之间。只读存储器耦接至该内部总线,并用来储存一程序代码。控制逻辑电路耦接于该内部总线与一闪存模块之间,该闪存模块外部耦接于该闪存控制器。处理器耦接至该内部总线,并用来执行该程序代码以通过使用该控制逻辑电路来对该闪存模块进行存取。快取耦接至该内部总线。该闪存模块包含有多个芯片,每一芯片包含有多个储存页,每一储存页包含有多个储存区段。当该处理器从该主机通过该接口电路与该内部总线接收到一特定写入命令以及具有N个储存区段的数据量的特定数据时,该处理器比较该N个储存区段的该数据量与该闪存模块内的一最小写入单元的一数据量来决定是否产生一基于闪存的快取信息以建立或更新一二叉树。
根据本申请实施例,公开了一种记忆装置。记忆装置包含一闪存模块以及上述的闪存控制器。
根据本申请实施例,公开了一种闪存控制器的方法。该方法包含:提供耦接于一主机与一内部总线之间的一接口电路;提供耦接于该内部总线与一闪存模块之间的一控制逻辑电路、该闪存模块外部耦接于该闪存控制器,该闪存模块具有多个芯片,每一芯片具有多个储存页,每一储存页具有多个储存区段;提供耦接于该内部总线的一快取;以及当从该主机通过该接口电路与该内部总线接收到一特定写入命令以及具有N个储存区段的一数据量的一特定数据时,比较该N个储存区段的该数据量与该闪存模块内的一最小写入单元的一数据量以决定是否产生一基于闪存的快取信息来建立或更新一二叉树。
附图说明
图1是本申请一实施例一记忆装置的方块示意图。
图2是当该闪存控制器从该主机接收到数据D1时图1所示的闪存控制器建立并插入节点N0来更新二叉树的操作实施例示意图。
图3是当该闪存控制器从该主机接收到数据D2时图1所示的闪存控制器插入节点N1来更新二叉树的操作实施例示意图。
图4是当该闪存控制器从该主机接收到数据D3时图1所示的闪存控制器插入节点N2来更新二叉树的操作实施例示意图。
图5是本申请一实施例该处理器重新编排二叉树以降低其阶层个数的示意图。
图6是当数据D1与数据D2之前半段部分所形成的128个储存区段的数据从该快取(例如动态随机存取内存)被搬移并接着被写入至该闪存模块的一储存页时图1所示的闪存控制器从二叉树删除节点N0以更新图4的二叉树的操作实施例示意图。
图7是当数据D1与数据D2之前半段部分所形成的128个储存区段的数据从该快取(例如动态随机存取内存)被搬移并接着被写入至该闪存模块的一储存页时图1所示的闪存控制器从二叉树删除节点N1以更新图4的二叉树的操作实施例示意图。
图8是当数据D1与数据D2之前半段部分所形成的128个储存区段的数据从该快取(例如动态随机存取内存)被搬移并接着被写入至该闪存模块的一储存页时图1所示的闪存控制器插入一个新的节点N3至二叉树以更新图4的二叉树的操作实施例示意图。
图9是本申请实施例当从该主机接收数据时用以建立或更新二叉树的方法流程图。
图10是本申请另一实施例当该闪存控制器从该主机接收数据D1时该闪存控制器将数据D1决定为一剩余数据部分R1的操作实施例示意图。
图11是本申请另一实施例当该闪存控制器从该主机接收数据D2时该闪存控制器将数据D1与数据D2决定为一个储存页大小的数据P1与剩余数据部分R2以及揷入节点N0来更新二叉树的操作实施例示意图。
图12是本申请另一实施例当该闪存控制器从该主机接收数据D3时该闪存控制器将数据D1、D2、D3决定为储存页大小的数据P1、P2、P3与剩余数据部分R3以及揷入节点N1与N2来更新二叉树的操作实施例示意图。
图13是本申请另一实施例当从该主机接收数据时用以建立或更新二叉树的方法流程图。
其中,附图标记说明如下:
100 记忆装置
110 闪存控制器
111 接口电路
112 处理器
113 缓冲存储器
114 动态随机存取内存控制器
115 只读存储器
116 控制逻辑电路
120 闪存模块
130 主机
140 动态随机存取内存
210 数据表
220 二叉树
具体实施方式
图1是本申请一实施例的一记忆装置100的方块示意图。如图1所示,记忆装置100包括一闪存控制器110与一闪存模块120,其中闪存控制器110被用来存取闪存模块120。此外,闪存控制器110包括一接口电路111、一处理器112、一缓冲存储器113、一动态随机存取内存控制器114、一只读存储器(ROM)115以及一控制逻辑电路116,处理器112可以是包括两个核心C0和C1的一微处理器或一中央处理单元,只读存储器115用于储存一程序代码,处理器112执行该程序代码来控制闪存模块120的存取,核心C0主要被设置用来控制闪存控制器110和主机130之间的多个操作,而处理器112的核心C1主要被设置用来控制闪存控制器110和闪存模块120之间的多个操作,另外,动态随机存取内存控制器114被安排用来存取位于闪存控制器110外部的一动态随机存取内存140。
闪存模块120可以包括一或多个闪存芯片,每一闪存芯片包括多个储存区块,每一储存区块是一个最小擦除单元,另外,每一储存区块包括多个储存页,每一储存页可以是一个最小写入单元,例如,一个储存页的大小可以是64KB(亦即128个储存区段);然而,这并非是本申请的限制。另外,闪存模块120可以是立体NAND型的闪存模块。
在一实施例,记忆装置100可以是一可携式记忆装置,例如符合SD/MMC、CF、MS或XD规范的记忆卡,而主机130可以是一个能够与可携式记忆装置连接的电子装置,例如移动电话、膝上型计算机或个人计算机等等。在另一实施例中,记忆装置100可以是一固态硬盘(solid state drive,SSD)或符合一通用闪存储存(Universal Flash Storage,UFS)或嵌入式多媒体卡(Embedded Multi Media Card,EMMC)的规范的嵌入式储存装置。该记忆装置100可以被设置于一电子装置中,例如移动电话、膝上型计算机或个人计算机等等,而主机130可以是该电子装置内的一处理器。
在本实施例中,缓冲存储器113及/或动态随机存取内存140可被用来作为闪存控制器110的一快取(或称为控制器快取),以在从主机130所发送过来的数据被写入至闪存模块120之前暂时地储存该数据,使得如果主机130发送了一读取命令来要求读取该数据并且该数据目前仍被缓冲于该快取的话,则在该快取目前所快取暂存的该数据可以从该快取立刻或快速地取回以发送该笔数据至主机130。闪存控制器110的该快取可以是控制器110内所包括的缓冲存储器113,或者可以是外部耦接至控制器110的动态随机存取内存140的至少一部分,及/或缓冲存储器113与动态随机存取内存140的一个组合。
实作上,当主机130发送带有数据的一写入命令至控制器110以控制该控制器110将该数据写入至闪存模块120时,该数据被暂时地储存于数据快取中,其中该数据快取例如是动态随机存取内存140(但不限定)。当储存于缓冲存储器113或动态随机存取内存140中的数据量达到一预定值时(例如该数据量对应于闪存模块120的一或多个字线时或是对应于一个储存页大小的数据量时),将数据从该快取中搬移出并且接着将其写入至闪存模块120,在本实施例,当主机130发送一读取命令以请求该快取中所记录的逻辑地址的数据时,闪存控制器110可以直接存取该快取以发送该数据至主机130,而不用/也无需存取闪存模块120。如此,可以减少闪存控制器110的响应时间。
一个传统闪存控制器需要搜寻暂时储存在一控制器快取中的所有数据的所有逻辑地址,以确保该闪存控制器所获取的是有效数据。与现有技术相比,本申请的实施例为了提高搜寻速度并同时减少存取快取(例如具体来说是动态随机存取内存140)时的时间延迟,处理器112被安排当该数据从主机130所接收时用来基于闪存模块120的一最小写入单元的数据大小/长度或是从主机130所发送的不同写入命令所相应的相同或不同的一数据大小/长度,以较少或最少个数的节点来建立一二叉树,亦即优化该二叉树。
当主机130发送该读取命令至闪存控制器110时,处理器112可以通过该二叉树来搜寻该逻辑地址以更快速地得到所需要的数据,大幅增进闪存控制器110的效率并同时减少存取快取时的延迟,以便能够减少动态随机存取内存140的存取延迟。如果该快取是通过采用动态随机存取内存140来实现,则由于基于一个二叉树的一相应节点的快取信息(基于主机的快取信息或基于闪存的快取信息)来存取该快取也可能会造成某些延迟,因此使用较少或最少个数的节点所建立的二叉树能够大幅地减少动态随机存取内存140的延迟,以便有效地缩短控制器110的响应时间。
图2至图5分别显示了本申请的实施例当闪存控制器110从主机130接收到数据时控制器110用以建立与更新二叉树220的操作实施例示意图。
主机130例如会依序地发送一第一写入命令、数据D1与相应的逻辑地址LBA0,发送一第二写入命令、数据D2与相应的逻辑地址LBA64,以及发送一第三写入命令、数据D3与相应的逻辑地址LBA192至控制器110,以写入上述所提到的数据至闪存模块120,其中数据D1例如具有64个储存区段的数据量,数据D2例如具有128个储存区段的数据量,以及数据D3例如具有256个储存区段的数据量,其中一个储存区段指的是一闪存的一个较小的储存单元,例如一个储存页包含128个储存区段,然此并非是本申请的限制。
举例来说,记忆装置100会操作于主机130中的一循序写入模式而被允许连续地发送并写入一个较大数据量的数据至记忆装置100,然而这并非是本申请的限制,记忆装置100也可以操作于单一写入模式,再者,主机130也可以循序地写入具有相同数据量的多笔不同的数据至记忆装置100,也就是说,主机130可以被安排循序地写入具有相同或不同数据量的数据至记忆装置100。
在图2中,主机130发送该第一写入命令、数据D1与相应的逻辑地址LBA0至闪存控制器110,核心C0会将逻辑地址LBA0相应的数据D1储存至一快取,例如是动态随机存取内存140(于此动态随机存取内存140作为例子说明,但不限定),在本实施例中,数据D1储存于动态随机存取内存140的一快取索引“0”所相应的一区域中,其中在这个例子中该快取索引也被称为是一动态随机存取内存索引,而动态随机存取内存140包含记录了该快取索引“0”的一数据表21、该相应的逻辑地址LBA0以及数据D1的一数据大小,其中该数据大小例如是由储存区段的个数所定义,亦即储存区段长度“64”,而该快取索引例如是用来指示出一特定数据在动态随机存取内存140中的一储存区域的起始位置,例如,动态随机存取内存索引与储存区段长度之间的关系是当每一次该动态随机存取内存索引的值增加1时会对应于动态随机存取内存140中的八个储存区段的数据大小(但不限定),在其他实施例,储存区段的个数可以改变而不同。数据D1在动态随机存取内存140的一储存区域的起始位置是“0”,而其储存区段长度为“64”,因此下一笔数据(亦即数据D2)在动态随机存取内存140中的一储存区域的起始位置将会是“8”。
核心C0同时会发送该快取信息(亦即基于主机的快取信息,包含了快取索引“0”、逻辑地址LBA0与储存区段长度“64”)至核心C1以表示出数据D1储存于动态随机存取内存140中。接着,当核心C1是闲置时(例如在闪存模块120的忙碌时间时),核心C1可以根据从核心C0所发送的该快取信息以开始建立二叉树220。
以图2为例作说明,逻辑地址LBA0是该二叉树的节点N0(顶端节点),而二叉树220亦记录了该节点信息,该节点信息包含有节点索引“0”、逻辑地址LBA0、逻辑地址LBA0的重复计数次数CNT、快取索引“0”、该左节点(左子节点)的节点索引、该右节点(右子节点)的节点索引以及储存区段长度“64”,其中由于动态随机存取内存140中目前只具有一个逻辑地址LBA0,因此其重复计数次数CNT会等于0),此外,由于在这条件中没有任何节点跟随逻辑地址LBA0所相应的该顶端节点,该左节点与该右节点的节点索引均为“FFFF”。
接着,在图3中,主机130发送该第二写入命令与逻辑地址LBA64相应的数据D2至图3所示的闪存控制器110,而核心C0将逻辑地址LBA64相应的数据D2储存至动态随机存取内存140。在本实施例,数据D2储存于动态随机存取内存140的一快取索引“8”所相应的一区域中,而数据表210记录有该快取索引“8”、该相应的逻辑地址LBA64以及该储存区段长度“128”。数据D2在动态随机存取内存140中的储存区域的起始位置位于8,而数据D2具有128个储存区段的数据大小,因此,下一笔数据(亦即数据D3)在动态随机存取内存140中的储存区域的起始位置将会位于24。同时,核心C0会发送该快取信息(亦即该快取索引“8”、逻辑地址LBA64以及该储存区段长度“128”)至核心C1以表示出数据D2储存于动态随机存取内存140中。接着,当核心C1闲置时,核心C1会根据从核心C0所发送出的快取信息来更新二叉树220。
以图3为例,由于逻辑地址LBA64是大于逻辑地址LBA0,因此逻辑地址LBA64是跟随该二叉树的该顶端节点并成为其右节点,而二叉树220会记录其节点信息,该节点信息包含有该节点索引“1”、逻辑地址LBA64、逻辑地址LBA64的重复计数次数CNT(由于动态随机存取内存140目前只具有一个逻辑地址LBA64,因此重复计数次数CNT等于0)、快取索引“8”、该左节点的节点索引、该右节点的节点索引以及该储存区段长度“128”,其中由于没有任何节点跟随逻辑地址LBA64所相应的节点,因此该左节点与该右节点的节点索引均为“FFFF”。此外,由于逻辑地址LBA64所相应的节点索引“1”被加入至逻辑地址LBA0所相应的节点N0的右节点,因此节点N0的右节点被更新为“1”。
接着,在图4中,主机130发送该第三写入命令与逻辑地址LBA192相应的数据D3至图4所示的闪存控制器110,而核心C0会将逻辑地址LBA192相应的数据D3储存至动态随机存取内存140。在本实施例,具有256个储存区段的数据量的数据D3会被储存于动态随机存取内存140的一快取索引“24”所相应的一区域中,而数据表210会记录该快取索引“24”、该相应的逻辑地址LBA192以及该储存区段长度“256”。同时,核心C0会发送该快取信息(亦即该快取索引“24”、逻辑地址LBA192以及该储存区段长度“256”)至核心C1以表示出数据D3被储存于动态随机存取内存140中。接着,当核心C1闲置时,核心C1会根据从核心C0所发送出的该快取信息来更新二叉树220。
以图4为例,由于逻辑地址LBA192大于逻辑地址LBA64,因此逻辑地址LBA192所相应的节点索引“2”会位于该二叉树的逻辑地址LBA64的该节点索引“1”的一右节点,而二叉树220会记录其节点信息,其中该节点信息包含有该节点索引“2”、逻辑地址LBA192、逻辑地址LBA192的重复计数次数CNT(由于动态随机存取内存140中目前只有一个逻辑地址LBA192,因此其重复计数次数CNT等于0)、该快取索引“24”、该左节点的该节点索引、该右节点的该节点索引以及该储存区段长度“256”,其中由于目前没有任何节点跟随LBA192的节点,因此该左节点与该右节点的节点索引均为“FFFF”。此外,由于逻辑地址LBA192所相应的节点索引“2”被加入到逻辑地址LBA4所相应的节点索引“1”的右节点,因此节点索引“1”的该右节点的内容会被更新为节点索引“2”。
在一实施例,如果闪存控制器110从主机130接收到包含逻辑地址LBA64的一读取命令,以图4所示的二叉树220而言,处理器112会比较逻辑地址LBA64与二叉树220的该顶端节点的逻辑地址LBA0,并且由于逻辑地址LBA64大于逻辑地址LBA0,因此处理器112在下一个步骤会去找该顶端节点的右节点。接着,由于二叉树220的该顶端节点的右节点对应于逻辑地址LBA64而逻辑地址LBA64符合该读取命令中所要的逻辑地址,因此处理器112可以参照二叉树220的快取索引“8”来获取得到所需要的数据的快取地址,而处理器112会控制动态随机存取内存控制器114去读取快取索引“8”所相应的区域中所储存的数据D2并通过接口电路111传送该笔数据D2至主机130,而不会存取闪存模块120。鉴于上述,在上述实施例中仅使用了两步骤就可以找到所需要的数据,相较于传统技术必须使用三个步骤才有办法找到所需要的数据,本申请的实施例大幅增进了搜寻的速度。
此外,如果闪存控制器110从主机130接收到包含逻辑地址LBA7的一读取命令,则以图4所示的二叉树220为例来说,处理器112能够判断出逻辑地址LBA7并没有储存于动态随机存取内存140中。接着,处理器112可以控制该控制逻辑电路116去从闪存模块120读取出具有逻辑地址LBA7的数据并且接着通过接口电路111发送该笔数据至主机130。闪存控制器110可以快速地判断逻辑地址LBA7是否储存于该快取中(例如动态随机存取内存140),提升闪存控制器110的读取速度。
在一实施例,核心C1于闲置时可以重新编排二叉树220以减少其阶层个数(numberof layers)。例如,核心C1可以使用一自平衡二分搜索树算法(self-balancing binarysearch tree algorithm),例如是AVL树或是红黑树(red-black tree)以降低其阶层个数。以图5为例,二叉树220可以被旋转使得逻辑地址LBA64的节点N1变成该顶端节点,而逻辑地址LBA0的节点N0变成逻辑地址LBA64的节点N1的一左节点,二叉树220可据此而从3层被更新为2层,而其搜寻速度可获得进一步地提升。
对于使用动态随机存取内存140来实现该快取而言,闪存控制器110例如被用来控制该动态随机存取内存控制器114与控制逻辑电路116在每次当要被写入至闪存模块120的数据的数据量达到一预定值时从该快取中所缓冲的数据将该最小写入单元的数据大小(例如一个储存页)搬移并写入至闪存模块120,该预定值例如是一或多个储存页、一或多个字线或其他数据量等等。核心C0被安排用来相应地更新该数据表210中所记录的信息以及发送适当的信息至核心C1以通知核心C1关于二叉树220应要被更新的信息,核心C1在闲置时就可以更新该二叉树以移除上述有关的信息。
一最小写入单元的数据大小例如是一个储存页大小,例如等于64KB(亦即128个储存区段)的数据量;然而这并非是本申请的限制。换言的,每一次会是一个储存页大小的数据(例如128个储存区段的数据)从动态随机存取内存140被搬移并接着被写入至闪存模块120的一个相应的储存页,如此,实作上,由数据D1与数据D2的一部分(例如数据D2之前半段部分)所形成的128个储存区段的数据,亦即数据D1的所有内容及相应于快取索引“8”与具有储存区段长度“64”的数据D2的一部分的内容,例如会从动态随机存取内存140被搬移并接着被写入至闪存模块120的一个储存页。接着,由数据D2的另一部分(例如数据D2之后半段部分及数据D3的一部分)所形成的128个储存区段的另一数据,亦即相应于快取索引“16”并具有储存区段长度“64”的数据D2的另外其他部分以及相应于快取索引“24”并具有储存区段长度“64”的数据D3的一部分,例如会从动态随机存取内存140搬移并接着被写入至闪存模块120的下一个储存页。也就是说,如果从主机130所写入的多笔不同的特定数据的数据量分别不同于闪存模块120的最小写入单元的数据量,则该些不同的特定数据不会被依序且独自分别地写入至闪存模块120。
图6至图8分别显示了当由数据D1与数据D2之前半段部分所形成的128个储存区段的数据被搬移并接着被写入至闪存模块120的一个储存页时控制器110用以更新图4中的二叉树220的操作实施例示意图。如图6所示,在这个情况中,由数据D1的所有内容与数据D2之前半段部分所形成的128个储存区段的数据会从动态随机存取内存140被搬移至闪存模块120。由于所有的数据D1会从动态随机存取内存140搬移至闪存模块120,因此核心C0会删除相应的快取信息(亦即快取索引“0”、逻辑地址LBA0及储存区段长度“64”)并通知核心C1关于该快取信息被删除的信息。接着,核心C1在闲置时会被安排从二叉树220删除掉节点索引“0”的节点并且重置其相应的节点信息为默认值“FFFF”。举例来说,对于节点索引“0”,其逻辑地址LBA会被重置为“FFFF”,其重复计数次数CNT被重置为“0”,其快取索引被重置为“FFFF”,其左节点被重置为“FFFF”,其右节点会被重置为“FFFF”,以及其储存区段长度被重置为“FFFF”。节点索引“1”的节点会变成是顶端节点,而节点索引“1”的节点信息及节点索引“2”的节点信息则不变。应注意的是,当从该快取搬移所缓冲的数据至闪存模块120时,数据表210能够由核心C1所维护或更新而不使用到核心C0。
接着,由于数据D2之前半段部分是从动态随机存取内存140被搬移至闪存模块120,因此核心C0会被用来更新该数据表210中的快取信息,而核心C1是在闲置时更新二叉树220。例如,如图7所示,核心C0被用来将原有的快取信息(亦即快取索引“8”、逻辑地址LBA64与储存区段长度“128”)更新为一新的快取信息(快取索引“16”、逻辑地址LBA128与储存区段长度“64”)。核心C1在闲置时会从二叉树202中删除掉节点索引“1”的节点并将相应的信息重置为默认值“FFFF”。例如,对于节点索引“1”,其逻辑地址LBA会被重置为“FFFF”,其重复计数次数CNT被重置为“0”,其快取索引被重置为“FFFF”,其左节点被重置为“FFFF”,其右节点被重置为“FFFF”,以及其储存区段长度被重置为“FFFF”,节点索引“2”节点变成是顶端节点,而节点索引“2”的节点信息则不改变。
如图8所示,核心C0会通知核心C1关于该新的快取信息的内容(亦即快取索引“16”、逻辑地址LBA128与储存区段长度“64”)以及核心C1会基于该新的快取信息来更新二叉树220。例如,核心C1会增加或插入具有节点索引“3”的一节点N3至节点索引“2”的节点的左子节点,其中节点索引“3”的节点N3的节点信息包含逻辑地址LBA128、重复计数次数CNT等于0、快取索引“16”、左节点“FFFF”、右节点“FFFF”以及储存区段长度“64”,对于节点索引“2”的节点来说,其左节点的节点索引会被更新为“3”。
也就是说,对于动态随机存取内存140中所快取并要被主机130写入至闪存模块120的一特定数据来说,如果该特定数据的数据大小不同于一最小写入单元(例如是一个储存页)的数据大小时,则在本实施例,当每一次该特定数据的一部分从动态随机存取内存140被搬移至闪存模块120时,核心C1均会根据该特定数据的剩余的部分所相应的一或多个快取索引来删除一相应的节点以及重设快取信息并接着加入或插入一个新的节点与相应的快取信息至该二叉树。
图9是本申请一实施例当接收从主机130来的数据时用来建立或更新二叉树220的方法流程示意图。请搭配参照第1至图4及上述的段落说明,图9的方法流程的步骤描述于下:
步骤900:开始;
步骤902:接收从主机130来的数据;
步骤904:核心C0将所接收的数据储存或缓冲于该闪存控制器内部的一快取中;
步骤906:核心C0使用数据表210来记录快取信息,该快取信息包含快取索引、逻辑地址以及所接收的数据的数据长度;
步骤908:核心C0发送该快取信息至核心C1;
步骤910:核心C1判断是否已经建立了一个二叉树;如果没有任何二叉树被建立,则流程进行步骤912,反之,则流程进行步骤914;
步骤912:核心C1建立一个二叉树,该二叉树包含有一顶端节点与相应的快取信息,该快取信息记录了该顶端节点的节点索引为“0”、逻辑地址、快取索引、左节点、右节点以及所接收的数据的数据长度;
步骤914:核心C1比较所接收的数据的逻辑地址与该二叉树中存在的一或多个节点的逻辑地址来建立所接收的数据的逻辑地址所相应的节点以及记录相应的快取信息,该快取信息包含有一相应的节点索引、该逻辑地址、该快取索引、左节点、右节点以及所接收的数据的数据长度;
步骤916:闪存控制器110判断该快取中所储存的数据的数据量是否达到一预定值(例如一个储存页大小的数据量);如果该快取中所储存的数据的数据量达到该预定值,则流程进行步骤918,反之,流程进行步骤902以从主机130接收下一笔的数据;
步骤918:核心C1通过控制动态随机存取内存控制器114与控制逻辑电路116从该快取(例如动态随机存取内存140)搬移一个储存页大小的数据至闪存模块120;
步骤920:如果需要的话,则当核心C1闲置时从该二叉树中删除一或多个节点以及重设相应的快取信息为默认值“FFFF”以及接着加入一个新的节点与相应的快取信息至该二叉树,其中该新增加的节点用来表示该笔数据的一剩余的部分而该笔数据的另一部分数据已经从该快取被搬移至闪存模块120;以及
步骤922:结束。
而在其他实施例,为了降低当核心C1删除节点及新增节点的计算/运算成本,闪存控制器110能够基于该最小写入单元(例如闪存模块120的一个储存页)来建立二叉树220。
图10至图12分别显示了本申请另一实施例当闪存控制器110从主机130接收数据时用以建立及更新二叉树220的控制器110的操作实施例示意图。主机130例如会依序发送该第一写入命令、数据D1与逻辑地址LBA0、发送该第二写入命令、具有128个储存区段的数据D2与逻辑地址LBA64以及发送该第三写入命令、具有256个储存区段的数据D3与逻辑地址LBA192至控制器110,以便写入上述该些数据至闪存模块120,其中数据D1例如具有64个储存区段的数据量,数据D2例如具有128个储存区段的数据量,以及数据D3例如具有256个储存区段的数据量,一储存区段是一闪存的一较小的储存单元,例如一个储存页可能包含有128个储存区段。主机130例如可以使用一循序写入模式来写入一较大的数据量至记忆装置100。再者,在本实施例,其假设该最小写入单元(例如是一个储存页)的数据大小等于128个储存区段(但不限定)。核心C0被安排用来判断主机130是否使用了该循序写入模式来写入数据。如果该循序写入模式被使用,则核心C0会将一较大的数据量储存至一快取存储器,例如是一动态随机存取内存140而接着所储存的数据会被依序地从该快取存储器被搬移闪存模块120;凡此均并非是本案的限制。
在图10,当主机130发送该第一写入命令、数据D1与逻辑地址LBA0至闪存控制器110时,核心C0会将数据D1与逻辑地址LBA0储存至该快取存储器例如是动态随机存取内存140(但不限定)。数据D1储存于动态随机存取内存140的快取索引“0”与储存区段长度“64”两者所相应的区域,而动态随机存取内存140包含数据表210,数据表210记录有该快取索引“0”、该相应的逻辑地址LBA0与该储存区段长度“64”。在这个情况中,具有128个储存区段的数据量的数据D2还没有被接收。由于动态随机存取内存140中目前所缓存的总数据量(亦即数据D)的数据长度等于64个储存区段而其小于一个储存页大小的数据的储存区段长度(亦即128个储存区段),因此核心C0会被安排不产生基于闪存的快取信息至核心C1并据此将数据D1考虑或决定为一剩余数据部分R1,其中核心C0会将剩余的数据信息记录于动态随机存取内存140的一储存部分中,该剩余的数据信息包含该剩余数据部分R1的一起始快取索引与还没有被用来产生基于闪存的快取信息的相应的一储存区段长度,亦即该快取索引“0”与储存区段长度“64”,如图10所示。核心C0接着等待接收从主机130来的下一笔的数据。核心C0会一直等待从主机130来的数据,直到动态随机存取内存140中目前所缓存的数据量较大于或等于128个储存区段(也就是说等于一个储存页的数据大小的储存区段长度(储存区段的个数)时),核心C0才不会等待从主机130来的数据。由于核心C0在这个情况中不产生也不发送基于闪存的快取信息至核心C1以通知核心C1关于此信息,因此核心C1不会加入或更新一节点至二叉树220。如图10所指示,二叉树220此时没有包含任何节点。
接着,在图11,主机130会发送该第二写入命令、数据D2与逻辑地址LBA64至闪存控制器110,而核心C0会将数据D2与逻辑地址LBA64储存至动态随机存取内存140。在本实施例,相似地,数据D2储存于动态随机存取内存140的快取索引“8”与储存区段长度“128”两者所相应的区域中,而数据表210会记录有该快取索引“8”、该相应的逻辑地址LBA64与该储存区段长度“128”。在这个情况中,核心C0会比较动态随机存取内存140中目前所缓冲的总数据量与该最小写入单元(例如一个储存页)所定义的储存区段的个数,据此而获知动态随机存取内存140中目前所缓存的总数据量较大于或等于128个储存区段,核心C0会将数据D1与数据D2编排或视为是一组由该最小写入单元的数据P1与跟着该数据P1的一剩余数据部分R2所形成的数据,其中该数据P1由数据D1与数据D2之前半段部分所形成并对应于该快取索引“0”与储存区段长度“128”所定义的一储存区域,而该剩余数据部分R2由数据D2之后半段部分所形成并对应于该快取索引“16”与储存区段长度“64”所定义的一储存区域。核心C0会判定数据P1的逻辑地址为LBA0。接着,核心C0会通过发送快取信息至核心C1来通知核心C1关于数据P1的基于闪存的快取信息的内容,其中该基于闪存的快取信息包含该快取索引“0”、逻辑地址LBA0与储存区段长度“128”。此外,该剩余数据部分R2的起始快取索引“16”与相应的储存区段长度“64”均会被核心C0储存于动态随机存取内存140中。接着,当核心C1闲置时,核心C1会根据从核心C0来的该基于闪存的快取信息来更新二叉树220。例如,逻辑地址LBA0在二叉树220的节点N0(顶端节点),并且二叉树220也记录了其节点信息,该节点信息包含逻辑地址LBA0、逻辑地址LBA0的重复计数次数CNT(由于动态随机存取内存140中目前只有一个逻辑地址LBA0,因此其重复计数次数CNT等于0)、该快取索引“0”、左节点(左子节点)的节点索引、右节点(右子节点)的节点索引以及该储存区段长度“128”(由于一个储存页数据的数据大小等于128个储存区段,因此数据长度等于128)。此外,该左节点与该右节点的节点索引均为“FFFF”,这是由于在目前这个情况中没有任何节点跟着逻辑地址LBA0所相应的该顶端节点。此外,由于仍存在有该剩余数据部分R2,因此核心C0被安排等待接收从主机130来的下一笔数据。
接着,在图12,主机130发送该第三写入命令、数据D3与逻辑地址LBA192至闪存控制器110,而核心C0会将具有256个储存区段的数据量的数据D3以及逻辑地址LBA192储存至动态随机存取内存140。在本实施例,数据D3被储存于动态随机存取内存140的快取索引“24”与储存区段长度“256”两者所相应的一储存区域,而数据表210会记录该快取索引“24”、该相应的逻辑地址LBA192与该储存区段长度“256”。相似地,核心C0会判定第二数据D2的一部分(亦即后半段部分)与整个第三数据D3所形成的总数据量较大于128个储存区段,因此核心C0会将图11中的该剩余数据部分R2及第三数据D3编排或视为是一组由数据P2、P3与一剩余数据部分R3(跟随数据P3)所形成的数据,其中数据P2与P3分别相应于该最小写入单元(例如一个储存页),该数据P2对应于该快取索引“16”与储存区段长度“128”所定义的一储存区域,该数据P3对应于该快取索引“32”与储存区段长度“128”所定义的一储存区域,以及该剩余数据部分R3对应于该快取索引“48”与储存区段长度“64”所定义的一储存区域。核心C0会将数据P2的该逻辑地址决定为LBA128以及将数据P3的该逻辑地址决定为LBA256。接着,核心C0会产生并发送基于闪存的快取信息至核心C1以通知核心C1关于这样的快取信息的内容,其中该基于闪存的快取信息包含数据P2的快取索引“16”、逻辑地址LBA128与储存区段长度“128”,以及另包含数据P3的快取索引“32”、逻辑地址LBA256与该储存区段长度“128”。此外,剩余数据部分R3的该起始快取索引“48”与其相应的储存区段长度“8”均会被核心C0储存于动态随机存取内存140中。接着,当核心C1闲置时,核心C1会根据上述从核心C0发送而所接收到的基于闪存的快取信息来更新二叉树220。例如,逻辑地址LBA128所相应的该数据P2由二叉树220的节点N1(具有节点索引“1”)所表示,而节点N1的信息记录了该逻辑地址LBA128、逻辑地址LBA128的该重复计数次数CNT(由于动态随机存取内存140中目前只有一个逻辑地址LBA128,因此其重复计数次数CNT等于0)、该快取索引“16”、该左节点(左子节点)的该节点索引、该右节点(右子节点)的该节点索引以及该储存区段长度“128”(由于一个储存页数据的该数据大小等于128个储存区段,因此其长度等于128)。此外,该节点N1跟随该顶端节点,因此节点N0的该右节点的该节点索引被更新为“1”。此外,逻辑地址LBA256所相应的该数据P3由二叉树220的该节点N2(具有节点索引“2”)所表示,节点N2的信息记录了该逻辑地址LBA256、逻辑地址LBA256的该重复计数次数CNT(由于动态随机存取内存140中目前只有一个逻辑地址LBA256,因此其重复计数次数CNT等于0)、该快取索引“32”、该左节点(左子节点)的该节点索引、该右节点(右子节点)的该节点索引以及该储存区段长度“128”(由于一个储存页数据的该数据大小等于128个储存区段,因此其长度等于128)。此外,该节点N2跟随该节点N1,因此该节点N1的该右节点的该节点索引被更新为“2”。
相似地,在图12中所示的二叉树220可以被核心C1旋转,使得逻辑地址LBA128的该节点变成该顶端节点而逻辑地址LBA0的该节点变成是逻辑地址LBA128的节点的左节点,据此二叉树220就可以从3层的架构更新变成是2层的架构,而其节点搜寻速度可以进一步获得提升;其相关的操作相似于图5的操作,于此不再重述。此外,相似地,当数据从动态随机存取内存140被搬移至闪存模块120时,该数据表210会被核心C0更新,而二叉树220则被核心C1所更新。
在一实施例,如果闪存控制器110从主机130接收到包含逻辑地址LBA64的一读取命令而相应的数据还没有从动态随机存取内存140移除时,以图12中所示的二叉树220为例,核心C1比较逻辑地址LBA64与二叉树220的该顶端节点的逻辑地址LBA0和储存区段长度“128”,而由于逻辑地址LBA64落入于逻辑地址LBA0与储存区段长度“128”所定义的一储存空间内,因此核心C1所找到的是该顶端节点。如果该读取命令所要求的是逻辑地址LBA64与储存区段长度“128”所定义的数据的话,则核心C1在二叉树220中可以找到逻辑地址LBA0的节点与辑地址LBA128的节点,以得到相应的快取信息,使得核心C0可以基于从核心C1所获得的快取信息以发送相应的数据至主机130。
应注意的是,当数据通过一次搬移一个储存页数据从动态随机存取内存140搬移至闪存模块120时,核心C1在闲置时就可以直接从二叉树220删除掉一相应的节点与信息即可,而不用再计算及加入一或多个节点与相应的节点信息至二叉树220。由于二叉树220也可以被储存于该快取(例如动态随机存取内存140)中,因此上述可以大幅地减轻存取动态随机存取内存140时的计算量/成本及频率。
再者,应注意的是,在其他实施例,任何两笔依序从主机130所发送至控制器110的数据的逻辑地址也可以是不连续的。以上实施例变型均并非是本案的限制。
图13是本申请另一实施例当从主机130接收到数据时用以建立或更新二叉树220的方法流程示意图。请搭配参照图10至图12,图13的流程步骤描述于下:
步骤1300:开始;
步骤1302:从主机130接收数据;
步骤1304:核心C0将所接收的数据储存或缓存于闪存控制器110内部的一快取;
步骤1306:核心C0使用数据表210记录快取信息,该快取信息包含快取索引、逻辑地址与所接收的数据的数据长度;
步骤1308:核心C0监控该快取中目前所快取的数据量来决定是否要产生并发送基于闪存的快取信息至核心C1;如果所监控的数据量大于或等于一个最小写入单元的该数据大小(例如一个储存页的数据大小,例如128个储存区段),则流程进行步骤1310,反之,流程进行步骤1302以接收其他的数据;
步骤1310:核心C0产生并发送相应的基于闪存的快取信息至核心C1;
步骤1312:核心C1根据所相应的基于闪存的快取信息来建立或更新一二叉树;
步骤1314:核心C1通过控制该动态随机存取内存控制器114与控制逻辑电路116从该快取(例如动态随机存取内存140)搬移一个储存页大小的数据以将该储存页大小的数据写入至闪存模块120的一储存页;
步骤1316:核心C1于闲置时从该二叉树删除掉一或多个节点并重设相应的基于闪存的快取信息为默认值“FFFF”而不加入新的节点至该二叉树;以及
步骤1318:结束。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
- 上一篇:石墨接头机器人自动装卡簧、装栓机
- 下一篇:扩容方法、电子设备及计算机可读存储介质