新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > NAND Flash嵌入式存储系统结构分析

NAND Flash嵌入式存储系统结构分析

作者:时间:2011-04-24来源:网络收藏

  

  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_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个块,主要是出于固件设计。当首次上电,固件程序通过读取 ID,获得设备的容量等信息,然后从Flash的最后一块中寻找BBI表,如果最后一块没有发现BBI表,则认为此块为坏块,继续前移寻找,依此类推,直到在预留的3个块中找到,并将其数据读入到在主控芯片为其开设的RAM中。如果还找不到,则固件认为该片Flash没有BBI表。

  交换块区是对 Flash进行擦除或写操作时用来临时存放数据,共分配5个块。选取5块是出于可靠性设计。用一个数组FlashSwapBlockStatus[FLASH_SWAP_BLOCKS]记录交换块状态:有效还是已经损坏。初始化时,固件认为所有的交换块都是有效块,在随后对其进行擦除或写操作时,通过读Flash状态寄存器判断该交换块的真实状态,并记录在数组中。交换块的管理围绕固件请求返回当前可用交换块地址或当前正在使用的交换块地址,并判断标记当前使用的交换块状态为坏。

  坏块映射区是当主机向数据区写数据时,检测到当前块(数据区)为坏块时,将数据写到坏块映射区中的相应好块中,并且将这两个块的块地址记录到BBI表中,以后主机若要对当前块(数据区)访问时,只需读BBI表就可以找到相应映射块,从而代替坏块的访问。这样就使文件所见逻辑块地址LBA(Logical Block Address)变成连续的,但实际上物理块地址PBA(Physical Block Address)可能并不连续。上述方法就是坏块管理的精髓。出于保守设计本文共选50块作为重映块。用数组FlashRemapBlockStatus[FLASH_BAD_BLOCKS_REMAP]标识坏块映射区的状态:未使用、已使用还是已经损坏。初始化时认为坏块映射区中所有块都是好块。

linux操作系统文章专题:linux操作系统详解(linux不再难懂)

上一页 1 2 3 下一页

评论


相关推荐

技术专区

关闭