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)); } }
yaffs_PutLevel0Tnode
最新推荐文章于 2020-06-23 07:36:58 发布