CN101364166A - 将2048字节页的Nand Flash模拟成硬盘的方法和装置 - Google Patents
将2048字节页的Nand Flash模拟成硬盘的方法和装置 Download PDFInfo
- Publication number
- CN101364166A CN101364166A CNA2008102113579A CN200810211357A CN101364166A CN 101364166 A CN101364166 A CN 101364166A CN A2008102113579 A CNA2008102113579 A CN A2008102113579A CN 200810211357 A CN200810211357 A CN 200810211357A CN 101364166 A CN101364166 A CN 101364166A
- Authority
- CN
- China
- Prior art keywords
- page
- sector
- piece
- byte
- block
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了一种将2048字节页的Nand Flash模拟成硬盘的方法和装置。该方法包括:接收磁盘文件系统对磁盘扇区的读操作或写操作;根据NandFlash中512字节页的OOB信息,获取与所述磁盘扇区对应的512字节页,并对所述获取的512字节页进行读操作、或块内页的顺序写操作;其中,所述512字节页由每一个2048字节页预先划分得到;所述OOB信息包括所述512字节页对应的逻辑单元、状态、逻辑扇区以及所在块的替换块。本发明中通过将2048字节页的Nand Flash中每个块的每一页划分为4个512字节页,并根据Nand Flash中512字节页的OOB信息实现了将2048字节页的NandFlash模拟成硬盘,从而可以在大页Nand Flash上运行磁盘文件系统。
Description
技术领域
本发明涉及通信技术领域,尤其涉及一种将2048字节页的Nand Flash模拟成硬盘的方法和装置。
背景技术
嵌入式系统中广泛的采用Flash(闪存)来存储程序和数据。Flash具有系统掉电后仍可保留内部信息及可擦写等功能特点。目前广泛使用的Flash主要有Nor Flash和Nand Flash两种。与Nor Flash相比,Nand Flash具有很好的性价比,更适合于在嵌入式系统中存储数据。
目前,Flash文件系统的种类主要包括JFFS2(Journaling Flash File System,日志闪存文件系统版本2)和YAFFS(Yet Another Flash File System,一种专为Nand Flash设计的日志文件系统)等Flash文件系统。但是,某些应用需要在Nand Flash上运行传统的磁盘文件系统,如FAT16(FAT16/32是DOS/Windows操作系统上的一种磁盘文件系统)、FAT32、EXT2(EXT2/3是Linux操作系统上的磁盘文件系统)和EXT3等。
Nand Flash的内部存储单元的结构是块页结构,一般情况下每个块(Block)由64个页(Page)组成,Nand Flash以块为单位进行擦除,以页为单位进行读写。根据页大小的不同,Nand Flash又分为两种,即512字节页和2048字节页;2048字节页的Nand Flash又称大页Nand Flash,由于具备存储量大等特点因此将逐渐成为使用趋势。
512字节页与2048字节页的Nand Flash相比最大的不同点在于,512字节页的Nand Flash支持对块内的页随机写,而2048字节页的Nand Flash在块内只能对页进行顺序的写操作。例如,设Block0为空闲块,现有Page0和Page1需要写入,对于512字节页的Nand Flash,对Page0和Page1的写顺序没有要求;而对于2048字节页的Nand Flash来说,必须先写入Page0,再写入Page1。其次,尽管Nand Flash上的每Bit只允许写一次,但是512字节页的Nand Flash可以将同一页分成多个部分进行写操作,而目前2048字节页的Nand Flash最多只允许对同一页进行8次写操作。目前,Flash文件系统(如YAFFS和JFFS2)很好的支持2048字节页的Nand Flash这个特点,而传统磁盘文件系统只支持对扇区进行随机写。由于512字节页Nand Flash支持对块内页的随机写,所以目前大部分的系统都支持将512字节页的Nand Flash模拟为硬盘,如Linux操作系统中MTD(Memory Technology Device,存储技术设备)子系统的NFTL(Nand Flash Translation Layer,Nand Flash转换层)模块。现有技术中,由于2048字节页的Nand Flash不支持块内页的随机写,同时页大小也与磁盘文件系统的扇区大小512字节不相等,所以目前还没有系统能够将2048字节页的Nand Flash模拟为硬盘。
发明内容
本发明提供一种将2048字节页的Nand Flash模拟成硬盘的方法和装置,用于实现将2048字节页的Nand Flash模拟成硬盘。
本发明提供一种将2048字节页的Nand Flash模拟成硬盘的方法,包括:
接收磁盘文件系统对磁盘扇区的读操作或写操作;
根据Nand Flash中512字节页的OOB信息,获取与所述磁盘扇区对应的512字节页,并对所述获取的512字节页进行读操作、或块内页的顺序写操作;
其中,所述512字节页由每一个2048字节页预先划分得到;所述OOB信息包括所述512字节页对应的逻辑单元、状态、逻辑扇区以及所在块的替换块。
其中,所述512字节页由每一个2048字节页预先划分得到包括:
将2048字节页的Nand Flash中每个块的每一页划分为4个512字节页,且在每一个512字节页后面存储所述512字节页对应的OOB信息;或
将2048字节页的Nand Flash中每个块的每一页划分为4个512字节页,且4个512字节页连续放置,所述4个512字节页之前或之后存储依次存储每一个512字节页对应的OOB信息。
其中,所述每个512字节页的OOB信息包括:
所述512字节页中512字节数据的校验码;
所述512字节页的状态为空闲Free或被占用Used;
所述512字节页对应的逻辑单元Unit;
所述512字节页所在块的替换块;
所述512字节页对应的逻辑单元Unit中的逻辑扇区Sector。
其中,所述获取与所述磁盘扇区对应的512字节页,并对所述获取的512字节页进行读操作具体包括:
接收磁盘文件系统发送的参数,所述参数包括磁盘扇区号和缓存区;
根据磁盘扇区号,计算得到所述磁盘扇区对应的逻辑单元号和在逻辑单元中的偏移;
根据逻辑单元号查找所述逻辑单元号对应的块链,不存在对应的块链时,向缓存区返回全0;存在对应的块链时,根据所述逻辑单元号对应的块链、以及所述磁盘扇区在逻辑单元中的偏移,查找到保存所述扇区最新数据的512字节页,将所述512字节页的数据拷贝到缓存区。
其中,所述存在对应的块链时,根据该逻辑单元号对应的块链、以及该磁盘扇区在逻辑单元中的偏移,查找到保存所述扇区最新数据的512字节页包括:
对所述逻辑单元号对应的块链中的块依次进行查找,查找到某块上512字节页的OOB Sector等于该磁盘扇区在逻辑单元中的偏移、且所述块的替换块不存在或所述块上的替换块上不存在OOB Sector等于所述磁盘扇区在逻辑单元中的偏移的512字节页;则所述查找到的块上的512字节页即为保存所述磁盘扇区最新数据的512字节页。
其中,所述获取与所述磁盘扇区对应的512字节页,并对所述获取的512字节页进行块内页的顺序写操作包括:
接收磁盘文件系统发送的参数,该参数包括磁盘扇区号和缓存区;
根据所述磁盘扇区号,计算得到所述磁盘扇区对应的逻辑单元号和在逻辑单元中的偏移;
根据所述逻辑单元号查找该逻辑单元号对应的块链,不存在对应的块链时获取一空闲块加入块链,将逻辑单元信息写入所述空闲块第0页的OOB,在所述空闲块的第一个空闲页中写入上述缓冲区中的数据,在所述空闲页的OOB的Sector中写入偏移的值,并将该空闲页的OOB的状态设置为已使用;否则继续;
存在对应的块链时,根据所述逻辑单元号对应的块链、以及所述磁盘扇区在逻辑单元中的偏移,判断对应的块链首块上是否有512字节页保存了所述磁盘扇区的数据,没有则在所述首块的第一个空闲页中写入上述缓冲区中的数据;否则继续;
获取上次保存所述磁盘扇区数据的512字节页所在的块,并判断上次保存所述磁盘扇区数据的块的替换块是否存在,存在则在所述替换块的第一个空闲页中写入上述缓冲区中的数据,在所述空闲页的OOB的Sector中写入偏移的值,并将该空闲页的OOB的状态设置为已使用;否则继续;
获取一空闲块加入块链,将逻辑单元信息写入所述空闲块第0页的OOB,将所述空闲块的块号写入保存有该磁盘扇区最新数据的512字节页所在的块中最后使用页的OOB中,在所述空闲块的第一个空闲页中写入上述缓冲区中的数据,在所述空闲页的OOB的Sector中写入偏移的值,并将该空闲页的OOB的状态设置为已使用。
其中,所述判断对应的块链首块上是否有512字节页保存了磁盘扇区的数据具体包括:判断首块上是否存在一512字节页,该512字节页的OOBSector等于该磁盘扇区在逻辑单元中的偏移,若存在则判断首块上有512字节页保存了磁盘扇区的数据;
所述获取上次保存所述磁盘扇区数据的512字节页所在的块具体包括:对该逻辑单元号对应的块链中的块依次进行查找,查找到某块上512字节页的OOB Sector等于该磁盘扇区在逻辑单元中的偏移、且该块的替换块不存在或该块上的替换块上不存在OOB Sector等于该磁盘扇区在逻辑单元中的偏移的512字节页,则该查找到的块上存在上次保存所述磁盘扇区最新数据的512字节页。
其中,所述根据所述磁盘扇区号,计算得到所述磁盘扇区对应的逻辑单元号和在逻辑单元中的偏移包括:
所述硬盘中的磁盘扇区号除以256并进行取整所得到的商,对应逻辑单元;
所述硬盘中的磁盘扇区号除以256所得到的余数,对应所述逻辑单元中的偏移。
本发明还提供一种Nand Flash的控制装置,用于将2048字节页的NandFlash模拟成硬盘,包括:
操作接收单元,用于接收磁盘文件系统对磁盘扇区的读操作或写操作;
OOB信息获取单元,用于获取Nand Flash中512字节页的OOB信息;所述512字节页由每一个2048字节页预先划分得到;所述OOB信息包括所述512字节页对应的逻辑单元、状态、逻辑扇区以及所在块的替换块;
读操作单元,用于根据Nand Flash中512字节页的OOB信息,获取与所述磁盘扇区对应的512字节页,并对所述获取的512字节页进行读操作;
写操作单元,用于根据Nand Flash中512字节页的OOB信息,获取与所述磁盘扇区对应的512字节页,并对所述获取的512字节页进行块内页的顺序写操作。
其中,还包括划分单元,所述划分单元具体用于:
将2048字节页的Nand Flash中每个块的每一页划分为4个512字节页,且在每一个512字节页后面存储所述512字节页对应的OOB信息;或将2048字节页的Nand Flash中每个块的每一页划分为4个512字节页,且4个512字节页连续放置,所述4个512字节页之前或之后存储依次存储每一个512字节页对应的OOB信息。
其中,所述读操作单元包括:
读操作接收子单元,用于接收磁盘文件系统发送的参数,所述参数包括磁盘扇区号和缓存区;
读操作获取子单元,用于根据磁盘扇区号,计算得到所述磁盘扇区对应的逻辑单元号和在逻辑单元中的偏移;
读操作执行子单元,用于根据逻辑单元号查找所述逻辑单元号对应的块链,不存在对应的块链时,向缓存区返回全0;存在对应的块链时,根据所述逻辑单元号对应的块链、以及所述磁盘扇区在逻辑单元中的偏移,查找到保存所述扇区最新数据的512字节页,将所述512字节页的数据拷贝到缓存区。
其中,所述读操作执行子单元根据该逻辑单元号对应的块链、以及该磁盘扇区在逻辑单元中的偏移,查找到保存所述扇区最新数据的512字节页时,具体用于:
对所述逻辑单元号对应的块链中的块依次进行查找,查找到某块上512字节页的OOB Sector等于该磁盘扇区在逻辑单元中的偏移、且所述块的替换块不存在或所述块上的替换块上不存在OOB Sector等于所述磁盘扇区在逻辑单元中的偏移的512字节页;则所述查找到的块上的512字节页即为保存所述磁盘扇区最新数据的512字节页。
其中,所述写操作单元包括:
写操作接收子单元,用于接收磁盘文件系统发送的参数,该参数包括磁盘扇区号和缓存区;
写操作获取子单元,用于根据所述磁盘扇区号,计算得到所述磁盘扇区对应的逻辑单元号和在逻辑单元中的偏移;
写操作执行子单元,用于根据所述逻辑单元号查找该逻辑单元号对应的块链,不存在对应的块链时获取一空闲块加入块链,将逻辑单元信息写入所述空闲块第0页的OOB,在所述空闲块的第一个空闲页中写入上述缓冲区中的数据,在所述空闲页的OOB的Sector中写入偏移的值,并将该空闲页的OOB的状态设置为已使用;存在对应的块链时,根据所述逻辑单元号对应的块链、以及所述磁盘扇区在逻辑单元中的偏移,判断对应的块链首块上是否有512字节页保存了所述磁盘扇区的数据,没有则在所述首块的第一个空闲页中写入上述缓冲区中的数据;
否则获取上次保存所述磁盘扇区数据的512字节页所在的块,并判断上次保存所述磁盘扇区数据的块的替换块是否存在,存在则在所述替换块的第一个空闲页中写入上述缓冲区中的数据,在所述空闲页的OOB的Sector中写入偏移的值,并将该空闲页的OOB的状态设置为已使用;
否则获取一空闲块加入块链,将逻辑单元信息写入所述空闲块第0页的OOB,将所述空闲块的块号写入保存有该磁盘扇区最新数据的512字节页所在的块中最后使用页的OOB中,在所述空闲块的第一个空闲页中写入上述缓冲区中的数据,在所述空闲页的OOB的Sector中写入偏移的值,并将该空闲页的OOB的状态设置为已使用。
其中,所述写操作执行子单元判断对应的块链首块上是否有512字节页保存了磁盘扇区的数据时,还用于:判断首块上是否存在一512字节页,该512字节页的OOB Sector等于该磁盘扇区在逻辑单元中的偏移,若存在则判断首块上有512字节页保存了磁盘扇区的数据;
所述写操作执行子单元获取上次保存所述磁盘扇区数据的512字节页所在的块时,还用于:对该逻辑单元号对应的块链中的块依次进行查找,查找到某块上512字节页的OOB Sector等于该磁盘扇区在逻辑单元中的偏移、且该块的替换块不存在或该块上的替换块上不存在OOB Sector等于该磁盘扇区在逻辑单元中的偏移的512字节页,则该查找到的块上存在上次保存所述磁盘扇区最新数据的512字节页。
与现有技术相比,本发明具有以下优点:
通过将2048字节页的Nand Flash中每个块的每一页划分为4个512字节页,并根据Nand Flash中512字节页的OOB信息,实现了将2048字节页的Nand Flash模拟成硬盘,并适应了大页Nand Flash需要在块内顺序写的特点,从而可以在大页Nand Flash上运行磁盘文件系统。
附图说明
图1是本发明中使用的MTD子系统的结构示意图;
图2是本发明中小页NandFlash的页结构示意图;
图3是本发明中小页NandFlash中OOB的数据结构示意图;
图4是本发明中块链的结构示意图;
图5是本发明中对于512字节页的Nand Flash,NFTL的读操作流程图;
图6是本发明中对于512字节页的Nand Flash,NFTL的写操作流程图;
图7A至图7C是本发明中NFTL对于512字节页的Nand Flash的操作示意图;
图8是本发明中2048字节页NandFlash页结构示意图;
图9是本发明中将2048字节页的Nand Flash模拟成硬盘的方法流程图;
图10A和图10B是本发明中2048字节页NandFlash划分为小页的示意图;
图11是本发明中2048字节页NandFlash中OOB的数据结构示意图;
图12A和12B是本发明中对于2048字节页的Nand Flash,NFTL的读操作流程图;
图13A和13B是本发明中对于2048字节页的Nand Flash,NFTL的写操作流程图;
图14A至图14C是本发明中NFTL对于2048字节页的Nand Flash的操作示意图;
图15是本发明中Nand Flash的控制装置的结构示意图;
图16是本发明中Nand Flash的控制装置的另一结构示意图。
具体实施方式
以下首先对本发明所涉及的Linux操作系统中用于管理Flash设备的MTD子系统进行介绍。
Linux操作系统中使用MTD子系统来管理各种Flash设备,如Nor Flash、Nand Flash等。MTD子系统的结构如图1所示,其中MTD Char将Flash模拟成字符设备,MTD Block将Flash模拟成MTD块设备并运行Flash文件系统,NFTL将Nand Flash模拟成硬盘并运行磁盘文件系统。
图1中MTD核心层(MTD Core)以及Nand Flash通用驱动的主要作用是识别和驱动Nand Flash芯片,对Nand Flash进行读、写和擦除操作。NFTL的主要作用为,将Nand Flash模拟为硬盘,建立磁盘文件系统中扇区与NandFlash中页的映射关系,并将磁盘文件系统的读写操作转换为Nand Flash的读、写和擦除操作。同时,由于磁盘扇区的寿命很长,磁盘文件系统设计时不会考虑写操作对扇区的损耗,但是Nand Flash的每个擦写块寿命有限,因此对Nand Flash的擦写操作还需要进行损耗均衡,尽量使擦写操作分布在整个芯片内部。综上所述,NFTL的主要作用主要包括两部分:(1)建立磁盘文件系统中扇区与Nand Flash中页的映射关系;(2)对Nand Flash擦写操作的损耗均衡。
以下说明对小页NandFlash(512字节页)进行读写的具体实现。
小页NandFlash的页结构如图2所示,每个存放数据的页都包括一个16字节的OOB(Out OfBand,Nand Flash上用来存储管理信息的空间)与其对应,NFTL通过维护OOB里保存的信息来对Nand Flash进行管理,实现上述映射关系的建立和擦写操作的损耗均衡。小页NandFlash中OOB的数据结构如图3所示,其中各项的内容如表1所示:
表1.NFTL OOB数据结构
OOB成员 | 大小(字节) | 说明 |
ECC | 6 | 校验码:记录512字节数据的ECC校验码 |
Status | 1 | 状 态:记录该页是Free(空闲)或者Used(已使用) |
Unit | 2 | 逻辑单元号:由于Nand Flash在物理结构上每个块由64个页组成,所以NFTL将磁盘文件系统的扇区也划分为逻辑单元,每个逻辑单元由64个扇区组成;通过将磁盘的扇区号除以64可以得到逻辑单元号。 |
ReplaceBlock | 2 | 替换块号:该成员指向下一个用来存储本逻辑单元的块。 |
Unused | 5 | 未使用 |
每次系统启动时NFTL会扫描整个Nand Flash芯片页所对应OOB的磁盘文件系统的逻辑单元号,建立物理擦写块与磁盘文件系统逻辑单元的映射关系,从而进一步建立Nand Flash页与磁盘扇区的对应关系。
磁盘文件系统可以直接在已经存放数据的扇区上重新写入数据,以达到对文件进行修改和删除的目的。但是,由于Nand Flash每个擦写块寿命有限,考虑到损耗均衡不直接对页进行擦写,而是NFTL在芯片上再找一个空闲的块,用来存放新的数据。形成一个如图4所示的块链,该链上的所有块都保存同一个逻辑单元数据。
对于512字节页的Nand Flash,NFTL的读操作流程如图5所示,包括:
步骤s501、磁盘文件系统传入参数扇区号和buffer。
步骤s502、NFTL计算逻辑单元号和扇区在逻辑单元中的偏移。假设Unit为逻辑单元号,Offset为扇区在逻辑单元中的偏移,则Unit=INT(扇区号/64);Offset=扇区号% 64,INT()表示取整函数。例如对于扇区号256,逻辑单元号Unit为256除以64得到的商的整数部分即4,偏移Offset为256除以64得到的余数部分即0。
步骤s503、NFTL查找保存本逻辑单元的块链。
步骤s504、判断块链是否存在,不存在则进行步骤s505,否则进行步骤s506。
步骤s505、块链不存在时,设置buffer的内容为全零。
步骤s506、记录块链的首块为Block1,设置Block0等于Block1。
步骤s507、判断Block0是否为有效块,是则进行步骤s508,否则进行步骤s510。
步骤s508、判断Block0上偏移为Offset的页的状态是否为Used,是则进行步骤s509,否则进行步骤s510。
步骤s509、判断Block0是否为块链的首块,是则进行步骤s505,否则进行步骤s511。
步骤s510、设置Block1等于Block0,Block0等于Block1的Replace Block,返回步骤s507。
步骤s511、将块Block1上偏移为Offset的页的内容拷贝到buffer。
对于512字节页的Nand Flash,NFTL的写操作流程如图6所示,包括:
步骤s601、磁盘文件系统传入参数扇区号和buffer。
步骤s602、NFTL计算逻辑单元号和扇区在逻辑单元中的偏移。假设Unit为逻辑单元号,Offset为扇区在逻辑单元中的偏移,则Unit=INT(扇区号/64);Offset=扇区号% 64。
步骤s603、判断本逻辑单元是否有对应的块链,是则进行步骤s604,否则进行步骤s609。
步骤s604、记录块链的首块为Block1,Block0等于Block1。
步骤s605、判断Block0是否为有效块,若不是有效块则进行步骤s606,否则进行步骤s607。
步骤s606、找一个空闲块Block0;将逻辑单元信息写入page0的OOB;将该块加入链中,进行步骤s610。该步骤中,只需将逻辑单元信息写入page0的OOB即可,不必要将逻辑单元信息写入每个OOB。
步骤s607、判断Block0上偏移为Offset的页的状态是否为空闲,是则进行步骤s610,否则进行步骤s608。
步骤s608、设置Block1等于Block0,Block0等于Block1的Replace Block,进行步骤s605。
如果Block1没有后续替代块时,其Replace Block中为无效标示值。
步骤s609、找一个空闲块Block0,将逻辑单元信息写入page0的OOB。
步骤s610、将buffer拷贝到块Block0上偏移为Offset的页中。
下面结合一个具体的应用场景阐述NFTL对于512字节页的Nand Flash的具体操作。假设磁盘文件系统新建一个文件;然后对文件进行修改;最后读取该文件。则包括以下流程:
(1)向扇区256、257、258写入数据。
具体的,如图7A所示,NFTL找到一个空闲块Block N,并在第0页的OOB内记录该块保存的是逻辑单元4;NFTL将扇区256、257、258,分别写入页0、1、2。其中逻辑单元的每一个扇区对应Black中的每一个页。
(2)修改扇区257、258的数据,并新增了扇区259的数据。
具体的,如图7B所示,NFTL再找一块空闲的擦除块Block M,并在第0页的OOB内记录该块保存的是逻辑单元4;在Block N的第0页的OOB内记录,下一个擦写块号(替换块号)为M;NFTL将扇区257、258新的数据写入Block M的第1页和第2页;NFTL将扇区259的数据写入Block N的第3页。
(3)修改扇区258、259的内容。
NFTL再找一块空闲的擦除块Block K,并在第0页的OOB内记录该块保存的是逻辑单元4;在Block M的第0页的OOB内记录,下一个擦写块号(替换块号)为K;NFTL将扇区258新的数据写入Block K的第2页;NFTL将扇区259新的数据写入Block M的第3页。
(4)读取该文件。
则读取扇区256:NFTL返回Blcok N页0的数据;读取扇区257:NFTL返回Block M页1的数据;读取扇区258:NFTL返回Block K页2的数据;读取扇区259:NFTL返回Block M页3的数据。
如前文所述,由于2048字节页的Nand Flash与512字节页的Nand Flash特性不同,上述的512字节页Nand Flash的读写方法不能直接运用于2048字节的Nand Flash。2048字节页Nand Flash与512字节页Nand Flash间的区别主要有以下两点:(1)2048字节页Nand Flash每页的数据大小为2048字节,OOB大小为64字节;2048字节页NandFlash页结构如图8所示,包括2048Bytes的Data以及64Bytes的OOB。(2)2048字节页Nand Flash要求顺序写块内的页,而512字节页Nand Flash没有这一要求。
针对上述问题,本发明提供一种将2048字节页的Nand Flash模拟成硬盘的方法。如图9所示,包括:
步骤s901、接收磁盘文件系统对磁盘扇区的读操作或写操作。
步骤s902、根据Nand Flash中512字节页的OOB信息,获取与所述磁盘扇区对应的512字节页,并对所述获取的512字节页进行读操作、或块内页的顺序写操作。
其中,所述512字节页由每一个2048字节页预先划分得到;所述OOB信息包括所述512字节页对应的逻辑单元、状态、逻辑扇区以及所在块的替换块。
具体的,由于2048字节页NandFlash可以对每页进行部分写,所以可以将每页进行图10A或图10B所示的划分。图10A所示的划分方法中,将所有的DATA统一置于页的前部,将所有的OOB统一置于页的后部。图10B所示的划分方法中,将DATA以及对应的OOB连续放置。
以下以采用图10B所示的划分方式为例说明本发明的具体实施方式。本发明中,上报给MTD核心层的块内的页数将是原来的4倍,即假如每块内有64个2048字节的页,则上报给MTD核心层的是每块内有256个512字节页。
对于2048字节页NandFlash,OOB的数据结构如图11所示,其中各项的内容如表2所示。
表2.本发明中修改后的NFTL OOB数据结构
OOB成员 | 大小(字节) | 说明 |
ECC | 6 | 校验码:记录512字节数据的ECC校验码 |
Status | 1 | 状态:记录该页是Free或者Used |
Unit | 2 | 逻辑单元:修改后,Nand Flash在物理结构上每个块由256个512字节页组成,所以每个逻辑单元由256个扇区组成;通过将磁盘的扇区号除以256可以得到逻辑单元号。 |
ReplaceBlock | 2 | 替换块号:该成员指向下一个用来存储本逻辑单元的块。 |
Sector | 1 | 逻辑扇区号(扇区号% 256):此项为新增内容,表示本页(512字节)对应逻辑单元的扇区号。 |
Unused | 4 | 未使用 |
对于2048字节页的Nand Flash,NFTL读取扇区的方法如图12A所示,包括:
步骤s121、接收磁盘文件系统发送的参数,该参数包括磁盘扇区号和缓存区。
步骤s122、根据磁盘扇区号,计算得到该磁盘扇区对应的逻辑单元号和在逻辑单元中的偏移。
步骤s123、根据逻辑单元号查找该逻辑单元号对应的块链,不存在对应的块链时,向缓存区返回全0。
步骤s124、存在对应的块链时,根据该逻辑单元号对应的块链、以及该磁盘扇区在逻辑单元中的偏移,查找到保存该磁盘扇区最新数据的512字节页,将该512字节页的数据拷贝到缓存区。
上述步骤s124中,具体的,对该逻辑单元号对应的块链中的块依次进行查找,查找到某块上512字节页的OOB Sector等于该磁盘扇区在逻辑单元中的偏移、且该块的替换块不存在或该块上的替换块上不存在OOB Sector等于该磁盘扇区在逻辑单元中的偏移的512字节页。则该查找到的块上的512字节页即为保存该磁盘扇区最新数据的512字节页。
如图12B所示,该读取扇区的一具体实现流程包括:
步骤s1201、磁盘文件系统传入参数扇区号和buffer(缓存)。
步骤s1202、NFTL计算逻辑单元号和扇区在逻辑单元中的偏移。假设Unit为逻辑单元号,Offset为扇区在逻辑单元中的偏移,则Unit=INT(扇区号/256);Offset=扇区号% 256。
步骤s1203、NFTL查找保存本逻辑单元的块链。
步骤s1204、判断块链是否存在,不存在则进行步骤s1205,否则进行步骤s1206。
步骤s1205、块链不存在时,设置buffer的内容为全零。
步骤s1206、记录块链的首块为Block1,设置Block0等于Block1。
步骤s1207、判断Block0是否为有效块,是则进行步骤s1208,否则进行步骤s1211。
步骤s1208、从0到255依次遍历Block0上的页。
步骤s1209、判断是否存在OOB Sector等于Offset的页,是则进行步骤s1211,否则进行步骤s1210。
步骤s1210、判断Block0是否为块链首块,是则进行步骤s1205,否则进行步骤s1212。
步骤s1211、设置Block1等于Block0,Block0等于Block1的Replace Block,返回步骤s1207。
步骤s1212、将块Block1上Sector为Offset的页的内容拷贝到buffer。
对于2048字节页的Nand Flash,NFTL写扇区的方法如图13A所示,包括:
步骤s131、接收磁盘文件系统发送的参数,该参数包括磁盘扇区号和缓存区。
步骤s132、根据磁盘扇区号,计算得到该磁盘扇区对应的逻辑单元号和在逻辑单元中的偏移。
步骤s133、根据逻辑单元号查找该逻辑单元号对应的块链,不存在对应的块链时进行步骤s134,否则进行步骤s135。
步骤s134、获取一空闲块,将逻辑单元信息写入所述空闲块第0页的OOB,并在所述空闲块的第一个空闲页中写入上述缓冲区中的数据。在该空闲页的OOB的Sector中写入Offset的值,并将该空闲页的OOB的Status设置为Used。
步骤s135、根据该逻辑单元号对应的块链、以及该磁盘扇区在逻辑单元中的偏移,判断对应的块链首块上是否有512字节页保存了磁盘扇区的数据,没有则进行步骤s136,否则进行步骤s137。
步骤s136、在块链首块的第一个空闲页中写入上述缓冲区中的数据;在该空闲页的OOB的Sector中写入Offset的值,并将该空闲页的OOB的Status设置为Used。
步骤s137、进一步查找块链后续块,获取保存该磁盘扇区最新数据的512字节页所在的块,并判断该块的替换块是否存在,存在则进行步骤s138,否则进行步骤s139。
步骤s138、在该替换块的第一个空闲页中写入上述缓冲区中的数据。
步骤s139、获取一空闲块加入块链,将逻辑单元信息写入所述空闲块第0页的OOB,将所述空闲块的块号写入保存有该磁盘扇区最新数据的512字节页所在的块中最后使用页的OOB中,并在所述空闲块的第一个空闲页中写入上述缓冲区中的数据。在该空闲页的OOB的Sector中写入Offset的值,并将该空闲页的OOB的Status设置为Used。
上述步骤s135中,判断首块上是否有512字节页保存了磁盘扇区的数据的方法具体为:判断首块上是否存在一512字节页,该512字节页的OOBSector等于该磁盘扇区在逻辑单元中的偏移,若存在则判断首块上有512字节页保存了磁盘扇区的数据。
上述步骤s137中,进一步查找块链后续块,获取保存该磁盘扇区最新数据的512字节页所在的块的方法具体为:对该逻辑单元号对应的块链中的块依次进行查找,查找到某块上512字节页的OOB Sector等于该磁盘扇区在逻辑单元中的偏移、且该块的替换块不存在或该块上的替换块上不存在OOBSector等于该磁盘扇区在逻辑单元中的偏移的512字节页,则该查找到的块上存在保存该磁盘扇区最新数据的512字节页。
如图13B所示,该写扇区的一具体实现流程包括:
步骤s1301、磁盘文件系统传入参数扇区号和buffer(缓存)。
步骤s1302、NFTL计算逻辑单元号和扇区在逻辑单元中的偏移。假设Unit为逻辑单元号,Offset为扇区在逻辑单元中的偏移,则Unit=INT(扇区号/256);Offset=扇区号% 256。
步骤s1303、判断本逻辑单元是否有对应的块链,是则进行步骤s1304,否则进行步骤s1309。
步骤s1304、记录块链的首块为Block1,Block0等于Block1。
步骤s1305、判断Block0是否为有效块,不是则进行步骤s1306,否则进行步骤s1307。
步骤s1306、找一个空闲块Block0;将逻辑单元信息写入page0的OOB;将本块号写入Block1最后的使用页的OOB中,进行步骤s1310。
步骤s1307、判断在Block0上是否存在OOB Sector等于Offset的页,是则进行步骤s1308,否则进行步骤s1310。
步骤s1308、设置Block1等于Block0,Block0等于Block1的Replace Block,进行步骤s1305。
步骤s1309、找一个空闲块Block0,将逻辑单元信息写入page0的OOB。
步骤s1310、找到Block0上第一个空闲页;将buffer拷贝到该空闲页中;在该空闲页的OOB的Sector中写入Offset的值,并将该空闲页的OOB的Status设置为Used。
对于2048字节页的Nand Flash,下面结合一个具体的应用场景阐述NFTL的具体操作。假设磁盘文件系统新建一个文件;然后对文件进行修改;最后读取该文件。则包括以下流程:
一、向扇区256、257、258写入数据。
具体的,如图14A所示,NFTL找到一个空闲块Block N,并在Page0的OOB内记录该块保存的是逻辑单元1;NFTL将扇区256、257、258,分别写入Page0、Page1、Page2。
以扇区256的数据写入为例,结合上述图13所述的流程,该数据写入过程包括以下步骤:
(1)根据扇区号256,获取逻辑单元号Unit=256/256=1,扇区在逻辑单元Unit中的偏移Offset=256%256=0。
(2)判断该逻辑单元1不存在对应的块链。
(3)找一个空闲块,这里假设找到的空闲块为Block N,将逻辑单元信息写入Block N的Page 0的OOB。
(4)找到Block N上第一个空闲页,这里假设找到的空闲页为Page 0,向需要写入扇区256的数据写入到Page 0中。在该Page 0的OOB的Sector中写入Offset的值0,并将Page0的OOB的Status设置为Used。
以扇区257的数据写入为例,结合上述图13所述的流程,该数据写入过程包括以下步骤:
(1)根据扇区号257,获取逻辑单元号Unit=257/256=1,扇区在逻辑单元Unit中的偏移Offset=257%256=1。
(2)判断该逻辑单元1存在对应的块链。
(3)由于块链的块首为BlockN,因此设置Block1=Block 0=Block N。
(4)判断Block0的值为有效值。
(5)判断在Block0上不存在OOB Sector等于Offset(Offset=1)的页。
(6)找到Block0(即Block N)上第一个空闲页,这里找到的空闲页为Page 1,向需要写入扇区257的数据写入到Page 1中,在该Page1的OOB的Sector中写入Offset的值1,并将该Page1的OOB的Status设置为Used。
对于扇区258的数据写入过程,与上述数据257的数据写入过程相似,在此不进行重复介绍。
二、修改扇区257、258的数据,并新增了扇区259的数据。
具体的,如图14B所示,NFTL再找一块空闲的擦除块Block M,并在Page 0的OOB内记录该块保存的是逻辑单元1;在Block N的Page 2的OOB内记录,下一个擦写块号为M;NFTL将扇区257、258新的数据写入Block M的Page 0和Page 1;NFTL将扇区259的数据写入Block N的Page 3。
以修改扇区257的过程为例,结合上述图13所述的流程,该数据修改过程包括以下步骤:
(1)根据扇区号257,获取逻辑单元号Unit=257/256=1,扇区在逻辑单元Unit中的偏移Offset=257%256=1。
(2)判断该逻辑单元1存在对应的块链。
(3)由于块链的块首为Block N,因此设置Block1=Block 0=Block N。
(4)判断Block0的值为有效值。
(5)判断在Block0上存在Sector等于Offset(Offset=1)的页。
(6)设置Block1=Block N,Block0=Block1的替换块=0xFFFF(即无效块,其原因为Block1的替换块并不存在)
(7)判断Block0的值为无效值。
(8)找一个空闲块,这里假设找到的空闲块为Block M,将逻辑单元号写入Block M的Page0的OOB,将Block M号写入Block1即Block N的最后使用页的OOB中。由于Block N的最后使用页为Page2,因此将Block M写入Block N的Page 2的OOB中。
(9)找到Block0即Block M的第一个空闲页,这里假设找到的空闲页为Page 0,向将扇区257中需要修改的数据写入到Block M的Page 0中。在该Page0的OOB的Sector中写入Offset的值1,并将该Page0的OOB的Status设置为Used。
以修改扇区258的过程为例,结合上述图13所述的流程,该数据修改过程包括以下步骤:
(1)根据扇区号258,获取逻辑单元号Unit=258/256=1,扇区在逻辑单元Unit中的偏移Offset=258%256=2。
(2)判断该逻辑单元1存在对应的块链。
(3)由于块链的块首为Block N,因此设置Block1=Block 0=Block N。
(4)判断Block0的值为有效值。
(5)判断在Block0上存在Sector等于Offset(Offset=1)的页。
(6)设置Block1=Block N,Block0=Block1的替换块=Block M。
(7)判断Block0的值为有效值。
(8)判断在Block M上不存在Sector等于Offset(Offset=2)的页。
(9)找到Block0即Block M的第一个空闲页,这里假设找到的空闲页为Page 1,向将扇区258中需要修改的数据写入到Block M的Page1中。在该Page 1的OOB的Sector中写入Offset的值2,并将该Page1的OOB的Status设置为Used。
对于扇区259的数据写入过程,与上述数据257、258的数据写入过程相似,在此不进行重复介绍。
三、修改扇区258、259的内容。
具体的,如图14C所示,NFTL再找一块空闲的擦除块Block K,并在Page0的OOB内记录该块保存的是逻辑单元1;在Block M的Page 1的OOB内记录,下一个擦写块号为K;NFTL将扇区258新的数据写入Block K的Page0;NFTL将扇区259新的数据写入Block M的Page 2。
以修改扇区258的过程为例,结合上述图13所述的流程,该数据修改过程包括以下步骤:
(1)根据扇区号258,获取逻辑单元号Unit=258/256=1,扇区在逻辑单元Unit中的偏移Offset=258%256=2。
(2)判断该逻辑单元1存在对应的块链。
(3)由于块链的块首为Block N,因此设置Block1=Block0=BlockN。
(4)判断Block0的值为有效值。
(5)判断在Block0上存在OOB Sector等于Offset(Offset=2)的页。
(6)设置Block1=Block N,Block0=Block1的替换块=Block M。
(7)判断Block0的值为有效值。
(8)判断在Block0上存在Sector等于Offset(Offset=2)的页。
(9)设置Block1=Block M,Block0=Block1的替换块=0xFFFF(即无效块,其原因为Block1的替换块并不存在)
(10)判断Block0的值为无效值。
(11)找一个空闲块Block0,这里假设找到的空闲块为Block K,将逻辑单元号写入Block K的Page0的OOB,将Block K号写入Block1即Block M的最后使用页的OOB中。由于Block M的最后使用页为Page 1,因此将BlockK写入Block M的Page 1的OOB中。
(12)找到Block0即Block K的第一个空闲页,这里假设找到的空闲页为Page 0,将扇区258中需要修改的数据写入到Block K的Page 0中,在该Page0的OOB的Sector中写入Offset的值2,并将该Page0的OOB的Status设置为Used。
以修改扇区259的过程为例,结合上述图13所述的流程,该数据修改过程包括以下步骤:
(1)根据扇区号259,获取逻辑单元号Unit=259/256=1,扇区在逻辑单元Unit中的偏移Offset=259%256=3。
(2)判断该逻辑单元1存在对应的块链。
(3)由于块链的块首为Block N,因此设置Block1=Block0=BlockN。
(4)判断Block0的值为有效值。
(5)判断在Block0上存在OOB Sector等于Offset(Offset=3)的页。
(6)设置Block1=Block N,Block0=Block1的替换块=Block M。
(7)判断Block0的值为有效值。
(8)判断在Block0上不存在OOB Sector等于Offset(Offset=3)的页。
(9)找到Block0(即Block M)上第一个空闲页,这里找到的空闲页为Page2,将扇区259中需要修改的数据写入到Block M的Page 2中,在该Page2的OOB的Sector中写入Offset的值3,并将该Page2的OOB的Status设置为Used。
四、读取该文件。
读取扇区256:NFTL返回Blcok N中Page 0的数据;读取扇区257:NFTL返回Block M中Page 0的数据;读取扇区258:NFTL返回Block K中Page 0的数据;读取扇区259:NFTL返回Block M中Page 2的数据。
以读取扇区256的过程为例,结合上述图12所述的流程,该数据读取过程包括以下步骤:
(1)根据扇区号256,获取逻辑单元号Unit=256/256=1,扇区在逻辑单元Unit中的偏移Offset=256%256=0。
(2)找到该逻辑单元1对应的块链。
(3)设置Block1=块链的首块=Block N,Block0=Block N。
(4)判断Block0的值为有效值。
(5)判断在Block N上存在Sector等于Offset(Offset=0)的页。
(6)设置Block1=Block N,Block0=Block N的替换块=Block M。
(7)判断Block0的值为有效值。
(8)判断在Block M上不存在Sector等于Offset(Offset=0)的页。
(9)判断Block M不是块链的首块。
(10)将Block1即Block N上Sector等于Offset(Offset=0)的页的内容读取出来拷贝到Buffer中,该页即为Block N中的Page 0。
以读取扇区258的过程为例,结合上述图12所述的流程,该数据读取过程包括以下步骤:
(1)根据扇区号258,获取逻辑单元号Unit=258/256=1,扇区在逻辑单元Unit中的偏移Offset=258%256=2。
(2)找到该逻辑单元1对应的块链。
(3)设置Block1=块链的首块=Block N,Block0=Block N。
(4)判断Block0的值为有效值。
(5)判断在Block N上存在Sector等于Offset(Offset=2)的页。
(6)设置Block1=Block N,Block0=Block N的替换块=Block M。
(7)判断Block0的值为有效值。
(8)判断在Block M上存在Sector等于Offset(Offset=2)的页。
(9)设置Block1=Block M,Block0=Block M的替换块=Block K。
(10)判断Block0的值为有效值。
(11)判断在Block K上存在Sector等于Offset(Offset=2)的页。
(12)设置Block1=Block K,Block0=Block K的替换块=无效块。
(13)判断Block0的值为无效值。
(14)将Block1即Block K上Sector等于Offset(Offset=2)的页的内容读取出来拷贝到Buffer中,该页即为Block K中的Page 0。
读取扇区257、259的过程与上述读取扇区258的过程相似,在此不进行重复描述。
本发明还提供一种Nand Flash的控制装置,用于将2048字节页的NandFlash模拟成硬盘,如图15所示,包括:
操作接收单元10,用于接收磁盘文件系统对磁盘扇区的读操作或写操作;
OOB信息获取单元20,用于获取Nand Flash中512字节页的OOB信息;所述512字节页由每一个2048字节页预先划分得到;所述OOB信息包括所述512字节页对应的逻辑单元、状态、逻辑扇区以及所在块的替换块;
读操作单元30,用于根据Nand Flash中512字节页的OOB信息,获取与所述磁盘扇区对应的512字节页,并对所述获取的512字节页进行读操作;
写操作单元40,用于根据Nand Flash中512字节页的OOB信息,获取与所述磁盘扇区对应的512字节页,并对所述获取的512字节页进行块内页的顺序写操作。
另外,本发明中的控制装置如图16所示,还可以包括:
划分单元50,所述划分单元具体用于:将2048字节页的Nand Flash中每个块的每一页划分为4个512字节页,且在每一个512字节页后面存储所述512字节页对应的OOB信息;或将2048字节页的Nand Flash中每个块的每一页划分为4个512字节页,且4个512字节页连续放置,所述4个512字节页之前或之后存储依次存储每一个512字节页对应的OOB信息。
另外,读操作单元30可以进一步包括:
读操作接收子单元31,用于接收磁盘文件系统发送的参数,所述参数包括磁盘扇区号和缓存区;
读操作获取子单元32,用于根据磁盘扇区号,计算得到所述磁盘扇区对应的逻辑单元号和在逻辑单元中的偏移;
读操作执行子单元33,用于根据逻辑单元号查找所述逻辑单元号对应的块链,不存在对应的块链时,向缓存区返回全0;存在对应的块链时,根据所述逻辑单元号对应的块链、以及所述磁盘扇区在逻辑单元中的偏移,查找到保存所述扇区最新数据的512字节页,将所述512字节页的数据拷贝到缓存区。读操作执行子单元根据该逻辑单元号对应的块链、以及该磁盘扇区在逻辑单元中的偏移,查找到保存所述扇区最新数据的512字节页时,具体用于:对所述逻辑单元号对应的块链中的块依次进行查找,查找到某块上512字节页的OOB Sector等于该磁盘扇区在逻辑单元中的偏移、且所述块的替换块不存在或所述块上的替换块上不存在OOB Sector等于所述磁盘扇区在逻辑单元中的偏移的512字节页;则所述查找到的块上的512字节页即为保存所述磁盘扇区最新数据的512字节页。
另外,写操作单元40可以进一步包括:
写操作接收子单元41,用于接收磁盘文件系统发送的参数,该参数包括磁盘扇区号和缓存区;
写操作获取子单元42,用于根据所述磁盘扇区号,计算得到所述磁盘扇区对应的逻辑单元号和在逻辑单元中的偏移;
写操作执行子单元43,用于根据所述逻辑单元号查找该逻辑单元号对应的块链,不存在对应的块链时获取一空闲块加入块链,将逻辑单元信息写入所述空闲块第0页的OOB,在所述空闲块的第一个空闲页中写入上述缓冲区中的数据,在所述空闲页的OOB的Sector中写入偏移的值,并将该空闲页的OOB的状态设置为已使用;否则存在对应的块链时,根据所述逻辑单元号对应的块链、以及所述磁盘扇区在逻辑单元中的偏移,判断对应的块链首块上是否有512字节页保存了所述磁盘扇区的数据,没有则在所述首块的第一个空闲页中写入上述缓冲区中的数据;否则获取上次保存所述磁盘扇区数据的512字节页所在的块,并判断上次保存所述磁盘扇区数据的块的替换块是否存在,存在则在所述替换块的第一个空闲页中写入上述缓冲区中的数据,在所述空闲页的OOB的Sector中写入偏移的值,并将该空闲页的OOB的状态设置为已使用;否则获取一空闲块加入块链,将逻辑单元信息写入所述空闲块第0页的OOB,将所述空闲块的块号写入保存有该磁盘扇区最新数据的512字节页所在的块中最后使用页的OOB中,在所述空闲块的第一个空闲页中写入上述缓冲区中的数据,在所述空闲页的OOB的Sector中写入偏移的值,并将该空闲页的OOB的状态设置为已使用。
写操作执行子单元43判断对应的块链首块上是否有512字节页保存了磁盘扇区的数据时,还用于:判断首块上是否存在一512字节页,该512字节页的OOB Sector等于该磁盘扇区在逻辑单元中的偏移,若存在则判断首块上有512字节页保存了磁盘扇区的数据;
写操作执行子单元43获取上次保存所述磁盘扇区数据的512字节页所在的块时,还用于:对该逻辑单元号对应的块链中的块依次进行查找,查找到某块上512字节页的OOB Sector等于该磁盘扇区在逻辑单元中的偏移、且该块的替换块不存在或该块上的替换块上不存在OOB Sector等于该磁盘扇区在逻辑单元中的偏移的512字节页,则该查找到的块上存在上次保存所述磁盘扇区最新数据的512字节页。
本发明提供的上述方法和装置中,通过将2048字节页的Nand Flash中每个块的每一页划分为4个512字节页,并根据Nand Flash中512字节页的OOB信息,实现了将2048字节页的Nand Flash模拟成硬盘,并适应了大页NandFlash需要在块内顺序写的特点,从而可以在大页Nand Flash上运行磁盘文件系统。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到本发明可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台设备执行本发明各个实施例所述的方法。
以上公开的仅为本发明的几个具体实施例,但是,本发明并非局限于此,任何本领域的技术人员能思之的变化都应落入本发明的保护范围。
Claims (14)
1、一种将2048字节页的Nand Flash模拟成硬盘的方法,其特征在于,包括:
接收磁盘文件系统对磁盘扇区的读操作或写操作;
根据Nand Flash中512字节页的OOB信息,获取与所述磁盘扇区对应的512字节页,并对所述获取的512字节页进行读操作、或块内页的顺序写操作;
其中,所述512字节页由每一个2048字节页预先划分得到;所述OOB信息包括所述512字节页对应的逻辑单元、状态、逻辑扇区以及所在块的替换块。
2、如权利要求1所述的方法,其特征在于,所述512字节页由每一个2048字节页预先划分得到包括:
将2048字节页的Nand Flash中每个块的每一页划分为4个512字节页,且在每一个512字节页后面存储所述512字节页对应的OOB信息;或
将2048字节页的Nand Flash中每个块的每一页划分为4个512字节页,且4个512字节页连续放置,所述4个512字节页之前或之后存储依次存储每一个512字节页对应的OOB信息。
3、如权利要求1或2所述的方法,其特征在于,所述每个512字节页的OOB信息包括:
所述512字节页中512字节数据的校验码;
所述512字节页的状态为空闲Free或被占用Used;
所述512字节页对应的逻辑单元Unit;
所述512字节页所在块的替换块;
所述512字节页对应的逻辑单元Unit中的逻辑扇区Sector。
4、如权利要求3所述的方法,其特征在于,所述获取与所述磁盘扇区对应的512字节页,并对所述获取的512字节页进行读操作具体包括:
接收磁盘文件系统发送的参数,所述参数包括磁盘扇区号和缓存区;
根据磁盘扇区号,计算得到所述磁盘扇区对应的逻辑单元号和在逻辑单元中的偏移;
根据逻辑单元号查找所述逻辑单元号对应的块链,不存在对应的块链时,向缓存区返回全0;存在对应的块链时,根据所述逻辑单元号对应的块链、以及所述磁盘扇区在逻辑单元中的偏移,查找到保存所述扇区最新数据的512字节页,将所述512字节页的数据拷贝到缓存区。
5、如权利要求4所述的方法,其特征在于,所述存在对应的块链时,根据该逻辑单元号对应的块链、以及该磁盘扇区在逻辑单元中的偏移,查找到保存所述扇区最新数据的512字节页包括:
对所述逻辑单元号对应的块链中的块依次进行查找,查找到某块上512字节页的OOB Sector等于该磁盘扇区在逻辑单元中的偏移、且所述块的替换块不存在或所述块上的替换块上不存在OOB Sector等于所述磁盘扇区在逻辑单元中的偏移的512字节页;则所述查找到的块上的512字节页即为保存所述磁盘扇区最新数据的512字节页。
6、如权利要求3所述的方法,其特征在于,所述获取与所述磁盘扇区对应的512字节页,并对所述获取的512字节页进行块内页的顺序写操作包括:
接收磁盘文件系统发送的参数,该参数包括磁盘扇区号和缓存区;
根据所述磁盘扇区号,计算得到所述磁盘扇区对应的逻辑单元号和在逻辑单元中的偏移;
根据所述逻辑单元号查找该逻辑单元号对应的块链,不存在对应的块链时获取一空闲块加入块链,将逻辑单元信息写入所述空闲块第0页的OOB,在所述空闲块的第一个空闲页中写入上述缓冲区中的数据,在所述空闲页的OOB的Sector中写入偏移的值,并将该空闲页的OOB的状态设置为已使用;否则继续;
存在对应的块链时,根据所述逻辑单元号对应的块链、以及所述磁盘扇区在逻辑单元中的偏移,判断对应的块链首块上是否有512字节页保存了所述磁盘扇区的数据,没有则在所述首块的第一个空闲页中写入上述缓冲区中的数据;否则继续;
获取上次保存所述磁盘扇区数据的512字节页所在的块,并判断上次保存所述磁盘扇区数据的块的替换块是否存在,存在则在所述替换块的第一个空闲页中写入上述缓冲区中的数据,在所述空闲页的OOB的Sector中写入偏移的值,并将该空闲页的OOB的状态设置为已使用;否则继续;
获取一空闲块加入块链,将逻辑单元信息写入所述空闲块第0页的OOB,将所述空闲块的块号写入保存有该磁盘扇区最新数据的512字节页所在的块中最后使用页的OOB中,在所述空闲块的第一个空闲页中写入上述缓冲区中的数据,在所述空闲页的OOB的Sector中写入偏移的值,并将该空闲页的OOB的状态设置为已使用。
7、如权利要求6所述的方法,其特征在于,
所述判断对应的块链首块上是否有512字节页保存了磁盘扇区的数据具体包括:判断首块上是否存在一512字节页,该512字节页的OOB Sector等于该磁盘扇区在逻辑单元中的偏移,若存在则判断首块上有512字节页保存了磁盘扇区的数据;
所述获取上次保存所述磁盘扇区数据的512字节页所在的块具体包括:对该逻辑单元号对应的块链中的块依次进行查找,查找到某块上512字节页的OOB Sector等于该磁盘扇区在逻辑单元中的偏移、且该块的替换块不存在或该块上的替换块上不存在OOB Sector等于该磁盘扇区在逻辑单元中的偏移的512字节页,则该查找到的块上存在上次保存所述磁盘扇区最新数据的512字节页。
8、如权利要求4或6所述的方法,其特征在于,所述根据所述磁盘扇区号,计算得到所述磁盘扇区对应的逻辑单元号和在逻辑单元中的偏移包括:
所述硬盘中的磁盘扇区号除以256并进行取整所得到的商,对应逻辑单元;
所述硬盘中的磁盘扇区号除以256所得到的余数,对应所述逻辑单元中的偏移。
9、一种Nand Flash的控制装置,用于将2048字节页的Nand Flash模拟成硬盘,其特征在于,包括:
操作接收单元,用于接收磁盘文件系统对磁盘扇区的读操作或写操作;
OOB信息获取单元,用于获取Nand Flash中512字节页的OOB信息;所述512字节页由每一个2048字节页预先划分得到;所述OOB信息包括所述512字节页对应的逻辑单元、状态、逻辑扇区以及所在块的替换块;
读操作单元,用于根据Nand Flash中512字节页的OOB信息,获取与所述磁盘扇区对应的512字节页,并对所述获取的512字节页进行读操作;
写操作单元,用于根据Nand Flash中512字节页的OOB信息,获取与所述磁盘扇区对应的512字节页,并对所述获取的512字节页进行块内页的顺序写操作。
10、如权利要求9所述的控制装置,其特征在于,还包括划分单元,所述划分单元具体用于:
将2048字节页的Nand Flash中每个块的每一页划分为4个512字节页,且在每一个512字节页后面存储所述512字节页对应的OOB信息;或将2048字节页的Nand Flash中每个块的每一页划分为4个512字节页,且4个512字节页连续放置,所述4个512字节页之前或之后存储依次存储每一个512字节页对应的OOB信息。
11、如权利要求9所述的控制装置,其特征在于,所述读操作单元包括:
读操作接收子单元,用于接收磁盘文件系统发送的参数,所述参数包括磁盘扇区号和缓存区;
读操作获取子单元,用于根据磁盘扇区号,计算得到所述磁盘扇区对应的逻辑单元号和在逻辑单元中的偏移;
读操作执行子单元,用于根据逻辑单元号查找所述逻辑单元号对应的块链,不存在对应的块链时,向缓存区返回全0;存在对应的块链时,根据所述逻辑单元号对应的块链、以及所述磁盘扇区在逻辑单元中的偏移,查找到保存所述扇区最新数据的512字节页,将所述512字节页的数据拷贝到缓存区。
12、如权利要求11所述的控制装置,其特征在于,所述读操作执行子单元根据该逻辑单元号对应的块链、以及该磁盘扇区在逻辑单元中的偏移,查找到保存所述扇区最新数据的512字节页时,具体用于:
对所述逻辑单元号对应的块链中的块依次进行查找,查找到某块上512字节页的OOB Sector等于该磁盘扇区在逻辑单元中的偏移、且所述块的替换块不存在或所述块上的替换块上不存在OOB Sector等于所述磁盘扇区在逻辑单元中的偏移的512字节页;则所述查找到的块上的512字节页即为保存所述磁盘扇区最新数据的512字节页。
13、如权利要求9所述的控制装置,其特征在于,所述写操作单元包括:
写操作接收子单元,用于接收磁盘文件系统发送的参数,该参数包括磁盘扇区号和缓存区;
写操作获取子单元,用于根据所述磁盘扇区号,计算得到所述磁盘扇区对应的逻辑单元号和在逻辑单元中的偏移;
写操作执行子单元,用于根据所述逻辑单元号查找该逻辑单元号对应的块链,不存在对应的块链时获取一空闲块加入块链,将逻辑单元信息写入所述空闲块第0页的OOB,在所述空闲块的第一个空闲页中写入上述缓冲区中的数据,在所述空闲页的OOB的Sector中写入偏移的值,并将该空闲页的OOB的状态设置为已使用;存在对应的块链时,根据所述逻辑单元号对应的块链、以及所述磁盘扇区在逻辑单元中的偏移,判断对应的块链首块上是否有512字节页保存了所述磁盘扇区的数据,没有则在所述首块的第一个空闲页中写入上述缓冲区中的数据;
否则获取上次保存所述磁盘扇区数据的512字节页所在的块,并判断上次保存所述磁盘扇区数据的块的替换块是否存在,存在则在所述替换块的第一个空闲页中写入上述缓冲区中的数据,在所述空闲页的OOB的Sector中写入偏移的值,并将该空闲页的OOB的状态设置为已使用;
否则获取一空闲块加入块链,将逻辑单元信息写入所述空闲块第0页的OOB,将所述空闲块的块号写入保存有该磁盘扇区最新数据的512字节页所在的块中最后使用页的OOB中,在所述空闲块的第一个空闲页中写入上述缓冲区中的数据,在所述空闲页的OOB的Sector中写入偏移的值,并将该空闲页的OOB的状态设置为已使用。
14、如权利要求13所述的控制装置,其特征在于,所述写操作执行子单元判断对应的块链首块上是否有512字节页保存了磁盘扇区的数据时,还用于:判断首块上是否存在一512字节页,该512字节页的OOB Sector等于该磁盘扇区在逻辑单元中的偏移,若存在则判断首块上有512字节页保存了磁盘扇区的数据;
所述写操作执行子单元获取上次保存所述磁盘扇区数据的512字节页所在的块时,还用于:对该逻辑单元号对应的块链中的块依次进行查找,查找到某块上512字节页的OOB Sector等于该磁盘扇区在逻辑单元中的偏移、且该块的替换块不存在或该块上的替换块上不存在OOB Sector等于该磁盘扇区在逻辑单元中的偏移的512字节页,则该查找到的块上存在上次保存所述磁盘扇区最新数据的512字节页。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2008102113579A CN101364166B (zh) | 2008-09-23 | 2008-09-23 | 将2048字节页的Nand Flash模拟成硬盘的方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2008102113579A CN101364166B (zh) | 2008-09-23 | 2008-09-23 | 将2048字节页的Nand Flash模拟成硬盘的方法和装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN101364166A true CN101364166A (zh) | 2009-02-11 |
CN101364166B CN101364166B (zh) | 2011-02-02 |
Family
ID=40390548
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN2008102113579A Active CN101364166B (zh) | 2008-09-23 | 2008-09-23 | 将2048字节页的Nand Flash模拟成硬盘的方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN101364166B (zh) |
Cited By (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101944065A (zh) * | 2010-08-24 | 2011-01-12 | 苏州国芯科技有限公司 | 一种基于扇区的闪存坏块屏蔽方法 |
CN102866862A (zh) * | 2012-07-26 | 2013-01-09 | 浪潮电子信息产业股份有限公司 | 一种基于4k扇区硬盘性能优化的方法 |
CN102955742A (zh) * | 2012-10-31 | 2013-03-06 | 浪潮集团有限公司 | 一种系统上电后固态硬盘地址映射表的快速重建方法 |
CN103176912A (zh) * | 2011-12-26 | 2013-06-26 | 中国移动通信集团公司 | 随机写的方法和转换器 |
CN103324493A (zh) * | 2012-03-20 | 2013-09-25 | 安凯(广州)微电子技术有限公司 | 基于nand flash的系统开机提速方法及系统 |
CN101840308B (zh) * | 2009-10-28 | 2014-06-18 | 创新科存储技术有限公司 | 一种分级存储系统及其逻辑卷管理方法 |
CN104267908A (zh) * | 2014-07-14 | 2015-01-07 | 北京君正集成电路股份有限公司 | 一种数据存储以及读取的方法及装置 |
CN104537075A (zh) * | 2014-12-30 | 2015-04-22 | 宁波三星电气股份有限公司 | Yaffs文件系统在NorFlash中的应用方法 |
CN105426313A (zh) * | 2014-09-12 | 2016-03-23 | 株洲南车时代电气股份有限公司 | 司法记录器数据存储结构、管理系统及管理方法 |
CN109445691A (zh) * | 2018-10-16 | 2019-03-08 | 深圳忆联信息系统有限公司 | 一种提高ftl算法开发和验证效率的方法及装置 |
CN110945486A (zh) * | 2018-06-30 | 2020-03-31 | 华为技术有限公司 | 一种存储碎片管理方法及终端 |
CN111723065A (zh) * | 2019-11-29 | 2020-09-29 | 北京天御云安科技有限公司 | 基于NOR flash的高可靠性文件系统设计方法 |
-
2008
- 2008-09-23 CN CN2008102113579A patent/CN101364166B/zh active Active
Cited By (19)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101840308B (zh) * | 2009-10-28 | 2014-06-18 | 创新科存储技术有限公司 | 一种分级存储系统及其逻辑卷管理方法 |
CN101944065B (zh) * | 2010-08-24 | 2012-07-04 | 苏州国芯科技有限公司 | 一种基于扇区的闪存坏块屏蔽方法 |
CN101944065A (zh) * | 2010-08-24 | 2011-01-12 | 苏州国芯科技有限公司 | 一种基于扇区的闪存坏块屏蔽方法 |
CN103176912A (zh) * | 2011-12-26 | 2013-06-26 | 中国移动通信集团公司 | 随机写的方法和转换器 |
CN103176912B (zh) * | 2011-12-26 | 2016-01-27 | 中国移动通信集团公司 | 随机写的方法和转换器 |
CN103324493B (zh) * | 2012-03-20 | 2016-10-05 | 安凯(广州)微电子技术有限公司 | 基于nand flash的系统开机提速方法及系统 |
CN103324493A (zh) * | 2012-03-20 | 2013-09-25 | 安凯(广州)微电子技术有限公司 | 基于nand flash的系统开机提速方法及系统 |
CN102866862A (zh) * | 2012-07-26 | 2013-01-09 | 浪潮电子信息产业股份有限公司 | 一种基于4k扇区硬盘性能优化的方法 |
CN102955742A (zh) * | 2012-10-31 | 2013-03-06 | 浪潮集团有限公司 | 一种系统上电后固态硬盘地址映射表的快速重建方法 |
CN104267908A (zh) * | 2014-07-14 | 2015-01-07 | 北京君正集成电路股份有限公司 | 一种数据存储以及读取的方法及装置 |
CN105426313A (zh) * | 2014-09-12 | 2016-03-23 | 株洲南车时代电气股份有限公司 | 司法记录器数据存储结构、管理系统及管理方法 |
CN104537075A (zh) * | 2014-12-30 | 2015-04-22 | 宁波三星电气股份有限公司 | Yaffs文件系统在NorFlash中的应用方法 |
CN104537075B (zh) * | 2014-12-30 | 2017-11-28 | 宁波三星医疗电气股份有限公司 | Yaffs文件系统在NorFlash中的应用方法 |
CN110945486A (zh) * | 2018-06-30 | 2020-03-31 | 华为技术有限公司 | 一种存储碎片管理方法及终端 |
CN110945486B (zh) * | 2018-06-30 | 2022-06-10 | 华为技术有限公司 | 一种存储碎片管理方法及终端 |
US11842046B2 (en) | 2018-06-30 | 2023-12-12 | Huawei Technologies Co., Ltd. | Storage fragment management method and terminal |
CN109445691A (zh) * | 2018-10-16 | 2019-03-08 | 深圳忆联信息系统有限公司 | 一种提高ftl算法开发和验证效率的方法及装置 |
CN109445691B (zh) * | 2018-10-16 | 2022-03-29 | 深圳忆联信息系统有限公司 | 一种提高ftl算法开发和验证效率的方法及装置 |
CN111723065A (zh) * | 2019-11-29 | 2020-09-29 | 北京天御云安科技有限公司 | 基于NOR flash的高可靠性文件系统设计方法 |
Also Published As
Publication number | Publication date |
---|---|
CN101364166B (zh) | 2011-02-02 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN101364166B (zh) | 将2048字节页的Nand Flash模拟成硬盘的方法和装置 | |
US11640353B2 (en) | Memory system, data storage device, user device and data management method thereof | |
US10649910B2 (en) | Persistent memory for key-value storage | |
US7461198B2 (en) | System and method for configuration and management of flash memory | |
US9087008B1 (en) | Replicating a volume using snapshots | |
JP5603997B2 (ja) | ストレージ装置及びデータ制御方法 | |
US7702845B2 (en) | Method and apparatus for managing blocks according to update type of data in block-type memory | |
US6636941B1 (en) | Enhanced stable disk storage | |
US20190146925A1 (en) | Method and system for enhancing flash translation layer mapping flexibility for performance and lifespan improvements | |
KR20070096429A (ko) | 빠른 마운팅을 지원하는 낸드 플래시 메모리에 적용되는파일시스템 | |
CN107239526A (zh) | 文件系统实现方法、碎片整理方法、操作位置定位方法 | |
WO2018171296A1 (zh) | 一种文件合并方法及控制器 | |
US20170160940A1 (en) | Data processing method and apparatus of solid state disk | |
CN109407985B (zh) | 一种数据管理的方法以及相关装置 | |
CN111007990B (zh) | 一种对快照系统中数据块引用进行快速定位的定位方法 | |
CN110780814B (zh) | 一种存储数据整理方法与装置 | |
CN116974458A (zh) | 用于处理数据的方法、电子设备和计算机程序产品 | |
CN112764662B (zh) | 用于存储管理的方法、设备和计算机程序产品 | |
JP6050794B2 (ja) | フラッシュメモリモジュール、不揮発性半導体メモリモジュール及びストレージ装置 | |
US11461225B2 (en) | Storage device, control method of storage device, and storage medium | |
CN109002265B (zh) | 一种数据处理的方法以及相关装置 | |
US9977612B1 (en) | System data management using garbage collection and logs | |
US11579789B2 (en) | Techniques for managing context information for a storage device | |
US9740632B1 (en) | Snapshot efficiency | |
US11354200B2 (en) | Method and system for facilitating data recovery and version rollback in a storage device |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
CP03 | Change of name, title or address | ||
CP03 | Change of name, title or address |
Address after: 310052 Binjiang District Changhe Road, Zhejiang, China, No. 466, No. Patentee after: Xinhua three Technology Co., Ltd. Address before: 310053 Hangzhou hi tech Industrial Development Zone, Zhejiang province science and Technology Industrial Park, No. 310 and No. six road, HUAWEI, Hangzhou production base Patentee before: Huasan Communication Technology Co., Ltd. |