您的位置 首页 电子

根据NAND Flash的转译层的规划

基于NAND Flash的嵌入式存储系统以其轻巧便携、读写速度快等特点成为当前嵌入式存储系统的主流配置。但由于固有坏块以及在擦、写过程中随机产生的坏块影响了NAND Flash的实际应用,所设计的NA

现在市场上闪存芯片首要有两类,即NAND Flash(Not And Flash ROM)和NOR Flash(Not Or Flash ROM)。前者具有容量大、读写速度快、芯片面积小、单元密度高、擦除速度快、本钱低一级特色,更合适于大批量数据存储的嵌入式体系。现在Windows仍是桌面体系的干流,对FAT文件体系供给了天然的支撑。然而就技能而言,FAT文件体系并不合适Flash,由于Flash设备并不是块设备[1],为了不损坏兼容性,并在NAND型闪存中运用FAT文件体系,国际上提出了闪存转译层FTL(Flash Translation Layer)的处理方案。

1 NAND Flash嵌入式存储体系结构

依据NAND Flash的存储体系的规划首要要处理坏块问题。由于NAND Flash自身存在固有坏块并在擦除和编程中又随机发生坏块,因而为了进步设备的牢靠性应该将这两种操作涣散在闪存不同的块中,以防止对某块的过度操作。
一般的依据NAND Flash嵌入式存储体系驱动结构分为三个层次:最底层是硬件操作接口,担任将主控芯片与Flash的操控管脚相连,这方面的固件首要完结对NAND Flash的物理操作;中间层是闪存转译层NFTL(NAND FTL),是封装在Flash驱动中的软件模块,其效果是将Flash模仿成与磁盘相类似的块设备,使对上层操作体系而言,NAND Flash就像一般磁盘相同被拜访。这一层首要是封装一些特别的杂乱办理操控功用;最上面的层便是文件办理层,功用类似于一般磁盘上的通用文件体系,向上层供给规范的文件操作接口。依据NAND Flash的嵌入式体系存储结构原理图如图1所示。


依据以上两个方面,既要在驱动中完结坏块办理,又要进行块模仿,所以可用的办法有两种[2]:一是在上层文件体系中处理坏块问题,驱动层只完结自身的功用,文件体系为驱动层供给不变的接口,为上层运用程序供给牢靠通明的服务。这种办法较简略,开发周期比较短,但只对特定运用的嵌入式体系有很强的适应性;第二种办法是在驱动层的NFTL中处理坏块问题,将不牢靠的NAND Flash虚拟成牢靠的存储设备,为上层文件体系供给牢靠通明服务,这种办法较榜首种更杂乱,可是此法具有较强的可移植性并能完全隔绝与文件体系的联络,其他文件体系也相同适用。

本文是以Samsung的NAND Flash K9F2808U0C作为存储芯片,规划了一种在NFTL上完结坏块办理并且完结接连数据读取的办法。

2 规划思维

2.1 闪存空间区分

K9F2808U0C是16 MB×8 bit的NAND Flash,共有1 024个Block,1 Block=16 KB,32 Page/Block,1 Page=528 B=(512 B+16 B),其间16 B为备用区,首要寄存NAND Flash出厂坏块符号、ECC校验码以及用户自界说区。K9F2808U0C地址空间是24 bit,分三个周期顺次送入NAND Flash的地址锁存器。本文运用的地址均为字节地址,数据类型为DWORD(4 B)。

将K9F2808U0C的存储空间区分为四个区:坏块映射表寄存区、交流块区、坏块映射区和实践数据寄存区。文件体系办理的空间便是实践的数据寄存空间,如图2所示。

2.2 各分区宏界说

#define FLASH_BLOCK_SIZE 0x40000 //16 KB/Block
#define FLASH_PAGE_SIZE 0x200 //512 B/Page
#define FLASH_SECTOR_SIZE 0x200
//1Page=1Sector(only K9F2808U0C)
#define FLASH_BLOCKS_TABLE 3//坏块映射表寄存块数
#define FLASH_SWAP_BLOCKS 5 //交流区的块数
#define FLASH_BAD_BLOCKS_REMAP 50
//坏簇重映区的块数
#define FLASH_MAX_ADDR 0xFFFFFF
//Flash最大字节地址
各分区首地址计算公式:
FLASH_BLOCK_TABLE_ADDR=FLASH_MAX_ADDR+
1-3*FLASH_BLOCK_SIZE);
FLASH_SWAP_BLOCK_ADDR=(FLASH_BLOCK_
TABLE_ADDR-5*FLASH_BLOCK_SIZE);
FLASH_BAD_BLOCK_REMAP_ADDR=(FLASH_SWAP_
BLOCK_ADDR-50*FLASH_BLOCK_SIZE);
FLASH_MAX_SECTOR_ADDR=(FLASH_MAX_ADDR-
3*FLASH_BLOCK_TABLE_ADDR-5*FLASH_SWAP_
BLOCK_ADDR-50*FLASH_BAD_BLOCK_REMAP_ADDR);
文件体系办理的最大字节地址。
恣意地址Addr:
地点块地址:Addr(~(FLASH_BLOCK_SIZE-1));
块内偏移地址:Addr(FLASH_BLOCK_SIZE-1);
块中的页:(Addr(FLASH_BLOCK_SIZE-1))/FLASH_
PAGE_SIZE;

2.3 分区功用规划

坏块映射区寄存仿制3份的坏块信息BBI(Bad Block Information)表。仿制3份是防备体系忽然断电,形成BBI表数据丢掉。挑选最终3个块,首要是出于固件规划。当Flash初度上电,固件程序经过读取Flash ID,取得设备的容量等信息,然后从Flash的最终一块中寻觅BBI表,假如最终一块没有发现BBI表,则以为此块为坏块,持续前移寻觅,依此类推,直到在预留的3个块中找到,并将其数据读入到在主控芯片为其开设的RAM中。假如还找不到,则固件以为该片Flash没有BBI表。

交流块区是对NAND Flash进行擦除或写操作时用来暂时寄存数据,共分配5个块。选取5块是出于牢靠性规划。用一个数组FlashSwapBlockStatus[FLASH_SWAP_BLOCKS]记载交流块状况:有用仍是现已损坏。初始化时,固件以为一切的交流块都是有用块,在随后对其进行擦除或写操作时,经过读Flash状况寄存器判别该交流块的实在状况,并记载在数组中。交流块的办理环绕固件恳求回来当时可用交流块地址或当时正在运用的交流块地址,并判别符号当时运用的交流块状况为坏。

坏块映射区是当主机向数据区写数据时,检测到当时块(数据区)为坏块时,将数据写到坏块映射区中的相应好块中,并且将这两个块的块地址记载到BBI表中,今后主机若要对当时块(数据区)拜访时,只需读BBI表就能够找到相应映射块,然后替代坏块的拜访。这样就使文件体系所见逻辑块地址LBA(Logical Block Address)变成接连的,但实践上物理块地址PBA(Physical Block Address)或许并不接连。上述办法便是坏块办理的精华。出于保存规划本文共选50块作为重映块。用数组FlashRemapBlockStatus[FLASH_BAD_BLOCKS_REMAP]标识坏块映射区的状况:未运用、已运用仍是现已损坏。初始化时以为坏块映射区中一切块都是好块。

3 NFTL坏块办理规划

3.1 构建BBI表

用一数组FlashBadBlockTable[2][FLASH_BAD_BLOCKS_REMAP]寄存BBI表。榜首维为坏块(数据区)的块地址,第二维为映射块地址(重映块)。

BBI表的构建可在Flash初度上电时,经过读取厂商设置在Flash备用区中的坏块符号辨认坏块,树立坏块映射表,此法初始化时刻与Flash的容量成正比;或经过读NAND Flash一切块内容并和0xFF作比较[3],假如不相同,则表明坏块。这种办法只针对新闪存,并且构建BBI表的时刻长,主控芯片的占用率高;另一种办法是在Flash初度上电时先不树立坏块表,以为当时一切的块都是好块,在随后操作中发现坏块,并更新BBI表。本文挑选后一种办法。

3.2 坏块映射表区的规划

将BBI表经过特别的办法保存,今后经过此种办法的逆历来辨认BBI表。坏块映射表区的3个块的规划办法如下:

(1)在每块最终一页的首字节处做特别符号,用于标识该块有没有预备被擦除:0xFF表明没有预备被擦除;0x00表明该块现已预备被擦除[4]。
(2)在每块的倒数第二页的首字节处写0x00,表明该块寄存BBI表数据;并在第2、3、4、5个字节处以大端形式寄存校验和,用于校验该块中寄存的一切数据的正确性。该页的剩下字节写0xFF。
(3)在榜首页起顺次写:表头特别符号(0x0055AAFF)、坏块总数(FlashBadBlockCount)、BBI表(FlashBadBlockTable)、重映块状况(FlashRemapBlockStatus),其结构如图3所示。

3.3 逻辑地址映射

在与主机批量数据传输时,首要对主机发送的CBW指令解析,然后固件取得主机恳求数据传输的LBA,再对LBA地址映射以此取得相应的PBA,然后再履行主机指令。具体办法:首要读取当时总的坏块数FlashBadBlocksCount,假如为0,表明无坏块,LBA就不必映射,直接回来;假如最终一次拜访地址与LBA同归于一个块,那么也不必地址映射;假如当时坏块的数量为1,判别LBA块地址与BBI表中坏块地址是否相同,然后决议是否采纳地址映射;假如当时坏块的数量不为1,就需求查找BBI表判别是不是含有LBA的块地址,假如存在,则要地址从头映射,假如不存在,就不必从头映射。能够选用二分法查表完结两地址快速比较[4]。

3.4 坏块处理

对映射后的地址进行写或擦除过程中发现当时块变坏的处理办法:首要查找映射区中的块状况FlashRemapBlockStatus[FLASH_BAD_BLOCKS_REMAP],寻觅可用的映射块。假如50个重映块都被符号为坏或已运用,则程序进入死循环;假如找到可用的映射块,则固件对或许呈现坏块的三种状况进行散转:(1)擦除当时块时犯错:将当时块地址与可用的重映块地址写入BBI表中,按地址巨细摆放有利于二分法查表,并回来重映块地址。(2)仿制某页从交流区到操作地址时失利:首要取得当时运用的交流块的块地址,然后判别操作地址是在数据存储区仍是在重映区。假如在重映区,阐明当时操作地址所对应的在数据存储区中的块现已是坏块,并且在这次操作中重映块也变坏,此刻就应该符号当时映射块状况为坏,并在重映区中寻觅下一个可用重映块,将本来在数据存储区中的块地址与更新后的映射块地址写入BBI表中,并回来新的映射后的地址;假如在数据存储区,就进行榜初度重映射,更新坏块表,并且将映射地址回来。然后再完结仿制作业。(3)向操作地址写一页数据时犯错:将当时地址地点块中的前面页从交流块中相应地址仿制到重映块,然后将操作地址地点当时页中的没有写到的数据从交流块中仿制,并将缓冲区中的数据从头写到重映射的地址中,并回来重映射地址。函数完结如下:

DWORD FlashDealBadBlock(DWORD Addr,DWORD Type)
{
DWORD i;
DWORD RemapBlockAddr;
DWORD SwapBlockAddr;
while(1)
{
RemapBlockAddr=FlashGetNewRemapBlock();
if(RemapBlockAddr==-1)
return Addr;
switch(Type)
{ case 1:
goto Exit;
break;
case 2:
SwapBlockAddr=FlashGetCurrentSwapBlock();
for(i=0;i(Addr(FLASH_BLOCK_SIZE-1))/
FLASH_PAGE_SIZE+1;i++)
{
if(0x00==(FlashCopyPage(SwapBlockAddr+
i*FLASH_PAGE_SIZE,RemapBlockAddr+
i*FLASH_PAGE_SIZE)))
goto BadRemapBlock;
}
goto Exit;
break;
case 3:
SwapBlockAddr=FlashGetCurrentSwapBlock();
for(i=0;i(Addr(FLASH_BLOCK_SIZE-1))/
FLASH_PAGE_SIZE;i++)
{
if(0x00==(FlashCopyPage(SwapBlockAddr+
i*FLASH_PAGE_SIZE,RemapBlockAddr+
i*FLASH_PAGE_SIZE)))
goto BadRemapBlock;
}
if(0x00==(FlashCopyPage(Addr,RemapBlockAddr+
i*FLASH_PAGE_SIZE)))
goto BadRemapBlock;
goto Exit;
break;
default:
break;
}
BadRemapBlock: FlashMarkRemapBlockBad
(RemapBlockAddr);
}
Exit:FlashUpdateBadBlockTable(Addr,RemapBlockAddr);
return RemapBlockAddr+(Addr(FLASH_BLOCK_SIZE-1));
}

3.5 接连读写操作

当主机与设备树立批量传输数据衔接时,固件经过解析CBW封包取得开始LBA。对该地址进行映射和坏块办理然后取得PBA。设置一个变量,当此变量有用时,表明主机对Flash仍需求读或写数据,直到此变量失效停止。一起将主机上一次读写扇区的地址存入另一个变量,此变量在接连读中效果不大,但在接连写时,经过与上一次写操作地址地点块做比较,判别是否同属一个块,以此决议是不是需求进行地址跨块处理。

本文规划了一种针对NAND型的闪存转译层,使NFTL完结地址映射和坏块办理以及接连读写数据的操作。对NAND Flash的分区规划,使块办理结构明晰,有利于固件的开发。本文没有对Flash的ECC校验进行过多的规划,这是由于在实践运用中NAND Flash首要用于存储多媒体数据(图片、语音文件)等,并不会对它进行频频的写入或擦除操作,并且多媒体文件数据对数据的完整性不灵敏[5],所以不需求对存储在其间的每一位数据进行严厉的ECC校验,能够经过别的规划简略的校验办法来替代ECC校验。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/dianzi/198689.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部