bi->sequenceNumber = dev->sequenceNumber;
dev->nErasedBlocks--;
T(YAFFS_TRACE_ALLOCATE,
(TSTR("Allocated block %d, seq %d, %d left" TENDSTR),
dev->allocationBlockFinder, dev->sequenceNumber,
dev->nErasedBlocks));
return dev->allocationBlockFinder;
}
yaffs_GetBlockInfo 函数获取指向 block 信息结构的指针,该函数比较简单,就不详细介
绍了。yaffs_BlockInfo 结构中的 blockState 成员描述该 block 的状态,比如空,满,已
损坏,当前分配中,等等。因为是要分配空闲块,所以块状态必须是
YAFFS_BLOCK_STATE_EMPTY,如果不是,就继续测试下一个 block。找到以后将 block 状
态修改为 YAFFS_BLOCK_STATE_ALLOCATING,表示当前正从该 block 中分配存储空间。正
常情况下,系统中只会有一个 block 处于该状 态。另外还要更新统计量 ErasedBlocks 和
sequenceNumber。这个 sequenceNumber 记录着各 block 被分配出去的先后 顺序,以后在
垃圾收集的时候会以此作为判断该 block 是否适合回收的依据。
现在让我们返回到函数 yaffs_AllocateChunk 中。yaffs_CheckSpaceForAllocation()函数
检查 Flash 上是否有足够的可用空间,通过检查后,就从当前供分配的 block 上切下一个
chunk:
if (dev->allocationBlock >= 0) {
bi = yaffs_GetBlockInfo(dev, dev->allocationBlock);
retVal = (dev->allocationBlock * dev->nChunksPerBlock) +
dev->allocationPage;
bi->pagesInUse++;
yaffs_SetChunkBit(dev, dev->allocationBlock,
dev->allocationPage);
dev->allocationPage++;
dev->nFreeChunks--;
/* If the block is full set the state to full */
if (dev->allocationPage >= dev->nChunksPerBlock) {
bi->blockState = YAFFS_BLOCK_STATE_FULL;
dev->allocationBlock = -1;
}
if(blockUsedPtr)
*blockUsedPtr = bi;
return retVal;
}
dev->allocationPage 记录着上次分配的 chunk 在 block 中的序号,每分配一次加 1。从这
里我们可以看出,系统在分配 chunk 的时候是从 block 的开头到结尾按序分配的,直到一
个 block 内的所有 chunk 全部分配完毕为止。retVal 是该 chunk 在整个 device 内的总序
号。PagesInUse 记录着该 block 中已分配使用的 page 的数量。