yaffs_PutLevel0Tnode

来源:互联网 发布:穿越火线网络异常23-2 编辑:程序博客网 时间:2024/05/01 09:35
 
void yaffs_PutLevel0Tnode(yaffs_Device *dev, yaffs_Tnode *tn, unsigned pos, unsigned val){//这个函数将某个Tnode设置为指定的值。tn是指向一组Tnode的指针;pos是所要设置的那个Tnode在该组Tnode中的索引;val就是所要设置的值,也就是物理chunk id。函数名中的Level0指映射树的叶节点。  __u32 *map = (__u32 *)tn;  __u32 bitInMap;  __u32 bitInWord;  __u32 wordInMap;  __u32 mask;//既然操作的是叶子结点,那么TNode储存的是16个长度为dev->tnodeWidth的chunk id.它用四位数字即可寻址16位。  pos &= YAFFS_TNODES_LEVEL0_MASK;  //pos不超过YAFFS_TNODES_LEVEL0_MASK = 4位。  val >>= dev->chunkGroupBits;  bitInMap = pos * dev->tnodeWidth; //bitInMap是pos在TNode结构中从TNode[0]算起的总位数。  wordInMap = bitInMap /32;  bitInWord = bitInMap & (32 -1);  mask = dev->tnodeMask << bitInWord;  map[wordInMap] &= ~mask;  map[wordInMap] |= (mask & (val << bitInWord));//dev->tnodeWidth可能超出16位,这样chunk id可能存储在两个16位的数中。  if(dev->tnodeWidth > (32-bitInWord)) {    bitInWord = (32 - bitInWord);    wordInMap++;;    mask = dev->tnodeMask >> (/*dev->tnodeWidth -*/ bitInWord);    map[wordInMap] &= ~mask;    map[wordInMap] |= (mask & (val >> bitInWord));  }}