TrueFFS翻译层.docx
《TrueFFS翻译层.docx》由会员分享,可在线阅读,更多相关《TrueFFS翻译层.docx(13页珍藏版)》请在冰豆网上搜索。
TrueFFS翻译层
NFTL文件函数
翻译层主要实现TrueFFS和DOS文件系统之间的高级交互功能,管理文件系统和Flash中各物理可擦块的关系,以及TrueFFS中各种智能化处理功能,例如块映射、损耗均衡(wear-leveling)等。
目前有三种不同的翻译层模块可供选择。
选择哪一种模块要根据使用的Flash介质采用NOR技术、还是NAND技术,或者SSFDC技术而定。
⏹坏块管理(BadBlockManagement):
NFTL_ReturnGetBadBlockTable(BadBlockElem*bbt,UINT16startBlock)找到坏块BBT,并且返回此坏块的列表,参数startBlock:
开始查找的物理块号,bbt:
坏块列表的头部;
NFTL_ReturnMarkBadBlock(UINT16blockNumber)将某一个数据块标记为坏块,如果返回的值是success,则表明正常标记坏块,否则标记坏块出现错误;参数blockNumber:
被标记为坏块的物理块号,
NFTL_ReturnAddBadBlock(UINT16blockNumber)在坏块列表的尾部添加一个坏块号,如果返回的值是success,则表明正常添加坏块,否则标记坏块出现错误,参数blockNumber:
添加的物理块号;
NFTL_ReturnFlushBadBlockTable(UINT16firstGoodBlock)将坏块列表写入flash和存放坏块列表的RAM;
NFTL_ReturnGetBadBlocksNumber(UINT16*numOfBadBlocks)返回目前flash中坏块的数目,如果返回的值是success,则表明没有发生错误,参数numOfBadBlocks代表此flash中坏块的数目;
NFTL_ReturnGetBadBlocksNumber(UINT16*numOfBadBlocks)保存目前flash中坏块的数目,如果返回的值是success,则表明没有发生错误,参数numOfBadBlocks代表此flash中坏块的数目;
NFTL_ReturnUnmount_BBM()
UINT8GetBBMBadBlocksNumber()
BadBlockElem*GetBBMBadBlockList()
voidSetBBMBadBlockList(BadBlockElem*value)
BadBlockElem*GetBBMlast()
voidSetBBMlast(BadBlockElem*value)
INT16GetBBMBootBlockNumber()
voidSetBBMBootBlockNumber(INT16value)
⏹损耗均衡(WearLeveling):
abtBufferGetWLABTPageBuffer(void)检查设备中的某一个数据块是否在数据结构中由此数据块位置的存储,如果返回的值是success,则此数据块已存在,否则此数据块不存在;
NFTL_ReturnCreateEmptyABT()创建一个新的数据块并且赋值为1;
NFTL_ReturnFlushABTImage(UINT16*ABT)向ABT块中写入数据,若返回值为success,则写入成功,否则写入失败,参数ABT:
flash中写入的位置;
NFTL_ReturnGetBestFreeBlock(UINT16*returnBlock)寻找合适的空闲数据块,若返回值为success,则有空闲的数据块可以使用,若返回值为NO_FREE_BLOCKS,则设备中没有空闲的数据块;
NFTL_ReturnAddFreeBlock(UINT16blockNumber,UINT8increment)在空闲块注册表FBC中增加一个空闲块,若返回值为success,表明数据块成功的加入到了空闲列表中,否则添加失败,参数blockNumber:
添加到空闲块列表的块号,increment:
数据块的增加程度;
NFTL_ReturnFlushAgingTable()把ABT从flash下载到RAM,更新存储在FBC表中ABT快的信息,若返回值为success,表明向flash的写入是正确的,否则错误;
NFTL_ReturnSetABTDimensions()计算ABT数据块包含的页的数目以及此数据块最后一页的位置,若返回值为success,表明操作是正确的,否则错误;
⏹垃圾回收(GarbageCollector):
NFTL_ReturnMinimizeStructure(UINT16*blockNumbers,UINT8len,void*mainElem,UINT16physicalBlockNumber,INT8newSector)此函数主要是用来执行坏块的擦除指令,如果返回的值是success,则碎片处理成功执行,否则发生错误;参数blockNumbers代表旧的数据结块中数据块的列表,len:
数据块的数目,mainElem:
碎片处理的指针,physicalBlockNumber:
有效数据的数据块号,newSector:
标示了引起碎片处理操作的扇区;
UINT16GetGCNumPageWritten()
voidSetGCNumPageWritten(UINT16value)
⏹存储管理(OSModule_MemoryManagement):
voidOS_MemCopy(void*destination,void*source,intsize)由source指向地址为起始地址的连续n个字节的数据复制到以destination指向地址为起始地址的空间;
voidOS_MemSet(void*destination,unsignedcharvalue,intsize)将destination所指向的size内存块中的每个字节的内容全部设置为value值;
char*OS_SearchString(void*string,void*searchString)找出searchString字符串在string字符串中第一次出现的位置
⏹结构管理(StructureManager)
NFTL_ReturnGetValidPagePosition(void*Node,UINT16*PhysicalBlockNumber,UINT16*PhysicalPage,UINT8Sector,UINT8*Position,UINT8flag)查找无效的扇区及其所在的位置,如果返回的值是PAGENOTFOUND,表明没有找到需要的扇区,如果返回的值是success,找到了需要的扇区,如果返回的值是FAILURE,表明有错误发生;参数Node:
指向根节点的指针,Sector:
要查找的扇区号,PhysicalBlockNumber:
有效扇区中的数据块,PhysicalPage:
有效扇区中的数据页,Position:
标示有效扇区的位置,flag:
标记此函数是否要求读写操作。
NFTL_ReturnAddBlock(UINT16PhysicalBlockNumber,UINT8*SpareBuffer,void**Node,UINT8*Conflict,UINT16*ConflictPhyBlockNum,UINT8newblock)在RAM的树结构中增加一个新的节点,如果返回的值是success,表明该节点成功的添加到树结构中,如果返回的值是FAILURE,表明有错误发生;参数Node:
指向根节点的指针,PhysicalBlockNumber:
新增节点的物理块,SpareBuffer:
新增节点的位置;
NFTL_ReturnAddNode(void**Root,UINT8information,UINT8LastWrite,UINT16PhyBlockNumber)在树结构中分配新的节点,如果返回的值是success,表明成功分配新的节点,如果返回的值是FAILURE,表明有错误发生;参数Root:
树的根节点,Information;表明树中的节点信息,PhyBlockNum:
与该节点相关的物理块号;
NFTL_ReturnSM_WritePage(UINT16VirtualBlock,UINT8Sector,UINT8*Buffer_data,void**Node)计算出被写入扇区的准确位置,并把树结构的信息写入备份区的缓冲区,如果返回的值是DATA_STRUCTURE_FULL,表明写入操作发生溢出,写入失败,如果返回的值是success,表明写入操作成功执行,如果返回的值是FAILURE,表明有错误发生;参数Node:
指向根节点的指针,Buffer_data:
写入根节点的数据,VirtualBlock:
扇区的虚拟块号,Sector:
写入的扇区号;
NFTL_ReturnSM_ReadPage(UINT16VirtualBlock,UINT8Sector,UINT8*Buffer,void*Node)计算出被读扇区的正确位置,如果返回的值是UNWRITTEN,表明扇区从来没有被写入过,如果返回的值是success,表明写入操作成功执行,如果返回的值是FAILURE,表明有错误发生;参数Node:
指向根节点的指针,Buffer:
数据缓冲区,VirtualBlock:
写入扇区的虚拟块号,Sector:
被读扇区号;
NFTL_ReturnIncrementWriteAddress(void*Node,UINT8Sector,UINT8PhysicalPage,UINT8*SpareBuffer,UINT16*NewPhysicalBlockNumber,UINT16*NewPhysicalPage)递增树结构中的写入位置,如果返回的值是DATA_STRUCTURE_FULL,表明地址溢出,树结构已没有可用的地址,如果返回的值是success,表明找到了需要的扇区,如果返回的值是FAILURE,表明有错误发生,参数Node:
指向根节点的指针,Sector:
写入扇区号,PhysicalPage:
最近更新扇区的物理页,SpareBuffer:
最新更新扇区的位置,NewPhysicalBlockNumber:
新的物理块号,NewPhysicalPage:
新的物理页;
UINT8DimensionDataStructure(void*Node)返回数据结构中组成特定虚拟快的叶子节点号,参数Node:
指向树形数据结构根节点的指针;
voidListInvalidBlock(void*Root,UINT16*InvalidBlocks)返回构成树形数据结构的块号,参数Root:
指向树形数据结构根节点的指针,InvalidBlocks:
返回构成树形数据结构的块号;
voidUpdatePhysicalBlock(void*Node,UINT16NewPhysicalBlockNumber)更新节点中的物理块号,参数Node:
指向树形数据结构根节点的指针,NewPhysicalBlockNumber:
节点中将要更新的块号;
NFTL_ReturnUpdateLastwrite(void*Node,UINT8LastWrite)更新节点中的物理块号,参数Node:
指向树形数据结构根节点的指针,LastWrite:
标示块中最新写入的扇区;
NFTL_ReturnEraseRAMStructure(void*Root)释放RAM中构成特定虚拟块的节点,参数Root:
指向树形数据结构根节点的指针;
NFTL_ReturnEraseLeafStructure(void**Root)释放RAM中特定虚拟块及其相应的物理块,如果返回的值是success,表明页擦除成功执行,否则有错误发生,参数Root:
指向树形数据结构根节点的指针;
voidGetSectorNumber(UINT8*SpareBuffer,UINT8PhysicalPage,UINT8*Sector)返回树形数据结构中特定物理页所在的扇区号,参数PhysicalPage:
树形数据结构物理页,Sector:
由物理页得到的扇区号,SpareBuffer:
该物理页在树形结构中的位置;
NFTL_ReturnGetRootCounter(void*Node,UINT8*RootCounter)返回指向某节点的根计数器,参数Node:
树形结构的根节点;
NFTL_ReturnEraseStructure(void*Root)擦除RAM中包括根节点的树形结构,参数Node:
树形结构的根节点;
NFTL_ReturnResolveConflict(void**Node,UINT16ConflictPhyBlockNum)解决同一虚拟快中两个根节点的冲突,参数ConflictPhyBlockNum:
发生冲突的物理块号,Node:
发生冲突的根节点;
NFTL_ReturnGetNodeByPosition(void*Root,UINT16*blockNumber)由树中特定的位置找到对应的节点,如果返回的值是success,没有错误发生,如果返回NODENOTFOUND,表明没有找到节点,参数Root:
树的根节点,Position:
节点在树中的位置,Node:
找到的节点;
NFTL_ReturnGetSectorOffset(SectorMapMap,UINT8Sector,UINT8*OffSet)返回特定扇区的偏移,且这一信息存储在扇区结构图中,如果返回的值是success,没有错误发生,如果返回FAILURE,表明操作失败,如果返回PAGENOTFOUND,表明该扇区没有被写入,PhyBlockNumber:
物理块号,LastWrite:
最新更新的扇区,PhyBlockNum:
与该节点相关的物理块号;
NFTL_ReturnSetSectorOffset(INT32Map,UINT8Sector,UINT8OffSet)设定扇区的偏移,如果返回的值是success,没有错误发生,如果返回FAILURE,表明操作失败,如果返回PAGENOTFOUND,表明该扇区没有被写入,参数PhyBlockNumber:
物理块号,LastWrite:
最新更新的扇区,PhyBlockNum:
与该节点相关的物理块号;
NFTL_ReturnCreateSectorMap(UINT16PhysicalBlockNumber,SectorMap*Map,UINT8*LastWrite)由给定的物理块号读该物理快的备份区,并建立扇区结构图,如果返回的值是success,没有错误发生,如果返回FAILURE,表明操作失败,参数PhyBlockNumber:
物理块号,Map:
扇区结构图;
NFTL_ReturnCopySectorMap(SectorMapOrigin,INT32Destination)复制原始的扇区结构图到目标扇区结构图,如果返回的值是success,没有错误发生,如果返回FAILURE,表明操作失败,参数PhyBlockNumber:
物理块号,Origin:
结构图,Destination:
结构图;
voidIncrementIndexCache()递增高速缓存的索引值;
NFTL_ReturnFindSectorMap(UINT16PhyBlockNum,SectorMap*SectorM)计算特定物理块的无效页,如果返回的值是success,没有错误发生,如果返回FAILURE,表明操作失败,参数PhyBlockNumber:
物理块号,V_Page:
有效页;
NFTL_ReturnEraseSectorMapToCache(UINT16PhyBlockNum)删除特定物理块号对应的扇区结构图,如果返回的值是success,没有错误发生,如果返回FAILURE,表明操作失败,参数PhyBlockNumber:
物理块号;
⏹翻译模型(TranslationModule):
staticNFTL_ReturnFormatFlash(void)擦除NANDflash中除坏块以外的所有位置,建立数据结构包括坏块的数目和每个物理块的大小,如果返回的值是success,没有错误发生,如果返回FAILURE,表明操作失败,没有参数;
staticNFTL_ReturnNFTLInitialize(void)初始化RAM中的所有结构以明确数据在flash的存储位置,如果返回的值是success,没有错误发生,如果返回FAILURE,表明操作失败,没有参数;
NFTL_ReturnNFTL_Initialize(void)
staticNFTL_ReturnWriteSector(UINT32VirtualAddress,UINT8*Buffer)用于管理扇区的数据结构,如果返回值是WRONG_ADDRESS,表明虚拟地址是错误的,如果返回的值是success,没有错误发生,如果返回FAILURE,表明操作失败,参数VirtualAddress:
扇区的地址,Buffer:
需要写入flash中的数据;
NFTL_ReturnFreeDirtySpace()
NFTL_ReturnNFTL_FreeDirtySpace()
staticNFTL_ReturnReadSector(UINT32VirtualAddress,UINT8*Buffer)查找flash中最新更新的扇区,如果返回值是WRONG_ADDRESS,表明虚拟地址是错误的,如果返回的值是success,没有错误发生,如果返回FAILURE,表明操作失败,参数VirtualAddress:
扇区的地址,Buffer:
需要从flash读出的数据;
NFTL_ReturnNFTL_Defrag(void)碎片回收,如果返回的值是success,没有错误发生,如果返回FAILURE,表明碎片回收操作失败;
voidUpdateVirtualToPhysicalMT(UINT16VBIndex,UINT16NewPhysicalBlockNumber)更新虚拟的和物理的数据结构来释放RAM空间,并更新根节点,参数VBIndex:
虚拟块号,NewPhysicalBlockNumber:
包含特定虚拟块根节点的物理块号;
NFTL_ReturnCallGarbageCollection(UINT16VirtualBlockNumber,UINT8Sector)调用垃圾回收器初始化所有的参数,如果返回值是WRONG_ADDRESS,表明虚拟地址是错误的,如果返回的值是success,没有错误发生,如果返回FAILURE,表明操作失败,参数VirtualBlockNumber:
与需要碎片回收的数据结构相关的虚拟块号,Sector:
引起碎片回收的扇区;
NFTL_ReturnIsInTable(UINT16*tempTable,intlen,UINT16value)
NFTL_ReturnNFTL_Unmount()
UINT8HD_NFlashRead(UINT32RD_NFlash_Address,UINT32sramAddress)
UINT8HD_NFlashWrite(UINT32sramAddress,UINT32WR_NFlash_Address)
UINT16DevNandWrite(UINT16clusNumber,UINT16sectorNumber,UINT32bufAddr,UINT16length,UINT16offset)
UINT16DevNandRead(UINT16clusNumber,UINT16sectorNumber,UINT32bufAddr)
NFTL_ReturnPartialDefrag(UINT16StartVBIndex,UINT16EndVBIndex)
UINT32NAND_MediaCapacity(void)
staticNFTL_ReturnUSBWriteSector(UINT32VirtualAddress,UINT8*Buffer)
NFTL_ReturnUSB_WriteSector(UINT32VirtualAddress,UINT8*Buffer)
staticNFTL_ReturnUSBReadSector(UINT32VirtualAddress,UINT8*Buffer)查找flash中最新更新的扇区,如果返回值是WRONG_ADDRESS,表明虚拟地址是错误的,如果返回的值是success,没有错误发生,如果返回FAILURE,表明操作失败,参数VirtualAddress:
扇区的地址,Buffer:
需要从flash读出的数据;
NFTL_ReturnUSB_ReadSector(UINT32VirtualAddress,UINT8*Buffer)
NFTL_ReturnNFTL_ReadSector(UINT32VirtualAddress,UINT8*Buffer)
NFTL_ReturnNFTL_WriteSector(UINT32VirtualAddress,UINT8*Buffer)
NFTL_ReturnNFTL_FormatFlash(void)
NFTL函数调用结构图
模块名
子模块
调用函数
NFTL
BadBlockManagement
NFTL_ReturnGetBadBlockTable()
NFTL_ReturnMarkBadBlock()
NFTL_ReturnAddBadBlock()
NFTL_ReturnFlushBadBlockTable()
NFTL_ReturnGetBadBlocksNumber()
NFTL_ReturnGetBadBlocksNumber()
NFTL_ReturnUnmount_BBM()
UINT8GetBBMBadBlocksNumber()
BadBlockElem*GetBBMBadBlockList()
voidSetBBMBadBlockList()
BadBlockElem*GetBBMlast()
voidSetBBMlast()
INT16GetBBMBootBlockNumber()
voidSetBBMBootBlockNumber()
WearLeveling
abtBufferGetWLABTPageBuffer()
NFTL_ReturnCreateEmptyABT()
NFTL_ReturnFlushABTImage()
NFTL_ReturnGetBestFreeBlock()
NFTL_ReturnAddFreeBlock()
NFT