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)); }}