Linux内核---25.yaffs2位图

yaffs 文件系统的位图如下所示:
每个block都会在chunk_bits数组中占几个字节, 字节每个bit指代了该block上的chunk的分配状态(0-示分配; 1-己分配)


1. 初始化
yaffs_guts_initialise
    -->  yaffs_init_blocks
  1. static int yaffs_init_blocks(struct yaffs_dev *dev)
  2. {
  3.     //chunks_per_block=128, 1个chunk 1个bit,那么128个chunk需要用16B来表示
  4.     dev->chunk_bit_stride = (dev->param.chunks_per_block + 7) / 8;          
  5.     dev->chunk_bits = kmalloc(dev->chunk_bit_stride * n_blocks, GFP_NOFS);   //所以chunk_bits数组需要16B*n_blocks
  6.     if (!dev->chunk_bits) {
  7.         dev->chunk_bits = vmalloc(dev->chunk_bit_stride * n_blocks);
  8.         dev->chunk_bits_alt = 1;
  9.     } else {
  10.         dev->chunk_bits_alt = 0;
  11.     }
  12.     if (!dev->chunk_bits)
  13.         goto alloc_error;

  14.     memset(dev->block_info, 0, n_blocks * sizeof(struct yaffs_block_info));
  15.     memset(dev->chunk_bits, 0, dev->chunk_bit_stride * n_blocks);
  16.     return YAFFS_OK;
  17. }
2. 设置
当调用yaffs_alloc_chunk分配一个chunk时就会在位图数组中设置一位,标识着该chunk己被占用
  1. yaffs_set_chunk_bit(dev, dev->alloc_block, dev->alloc_page);
  2. {
  3.     //参数: dev
  4.     // dev->alloc_block: 要分配chunk的block
  5.     // dev->alloc_page: 要分配的chunk号
  6.     //返回: 当前block在chunk_bits数组中的地址
  7.     u8 *blk_bits = yaffs_block_bits(dev, blk);
  8.     {
  9.         if (blk < dev->internal_start_block || blk > dev->internal_end_block) 
  10.         ;
  11.         //yaffs_init_blocks中赋值:
  12.         //dev->chunk_bit_stride = (dev->param.chunks_per_block + 7) / 8;
  13.         return dev->chunk_bits + (dev->chunk_bit_stride * (blk - dev->internal_start_block));  //获取当前block在位图数组的首地址
  14.     }

  15.     yaffs_verify_chunk_bit_id(dev, blk, chunk);
  16.     //此处chunk: 当前block上的第几个chunk
  17.     blk_bits[chunk / 8] |= (<< (chunk & 7)); //chunk/8指该chunk在block所占用的位图的第几个字节上,将这个字节的chunk_bit置位,表示己被占用
  18. }
注意: (u8 *)dev - > chunk_bits:    位图数组的首地址
(int)dev->chunk_bit_stride: 每个block在位图中占用了几个字节,它是在 yaffs_init_blocks中赋值的: dev - > chunk_bit_stride  =   ( dev - > param . chunks_per_block  +  7 )   /  8 ;

3. 在位图中取消一个chunk
  1. void yaffs_clear_chunk_bit(struct yaffs_dev *dev, int blk, int chunk)
  2. {
  3.     u8 *blk_bits = yaffs_block_bits(dev, blk);

  4.     yaffs_verify_chunk_bit_id(dev, blk, chunk);
  5.     blk_bits[chunk / 8] &= ~(<< (chunk & 7));    //知道了设置,那么释放很自己就是将这一位清0了
  6. }
4. 批量操作
  1. void yaffs_clear_chunk_bits(struct yaffs_dev *dev, int blk)
  2. {
  3.     u8 *blk_bits = yaffs_block_bits(dev, blk);

  4.     memset(blk_bits, 0, dev->chunk_bit_stride);         //将整个block所占位图中的Bytes都清0
  5. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值