Linux内核---25.yaffs2位图
2016-07-04 19:26
1086 查看
yaffs 文件系统的位图如下所示:
每个block都会在chunk_bits数组中占几个字节, 字节每个bit指代了该block上的chunk的分配状态(0-示分配; 1-己分配)
1. 初始化
yaffs_guts_initialise
--> yaffs_init_blocks
static int yaffs_init_blocks(struct yaffs_dev *dev)
{
//chunks_per_block=128, 1个chunk 1个bit,那么128个chunk需要用16B来表示
dev->chunk_bit_stride = (dev->param.chunks_per_block + 7) / 8;
dev->chunk_bits = kmalloc(dev->chunk_bit_stride * n_blocks, GFP_NOFS); //所以chunk_bits数组需要16B*n_blocks
if (!dev->chunk_bits) {
dev->chunk_bits = vmalloc(dev->chunk_bit_stride * n_blocks);
dev->chunk_bits_alt = 1;
} else {
dev->chunk_bits_alt = 0;
}
if (!dev->chunk_bits)
goto alloc_error;
memset(dev->block_info, 0, n_blocks * sizeof(struct
yaffs_block_info));
memset(dev->chunk_bits, 0, dev->chunk_bit_stride * n_blocks);
return YAFFS_OK;
}
2. 设置
当调用yaffs_alloc_chunk分配一个chunk时就会在位图数组中设置一位,标识着该chunk己被占用
yaffs_set_chunk_bit(dev, dev->alloc_block, dev->alloc_page);
{
//参数: dev
// dev->alloc_block: 要分配chunk的block
// dev->alloc_page: 要分配的chunk号
//返回: 当前block在chunk_bits数组中的地址
u8 *blk_bits = yaffs_block_bits(dev, blk);
{
if (blk < dev->internal_start_block || blk > dev->internal_end_block)
;
//yaffs_init_blocks中赋值:
//dev->chunk_bit_stride = (dev->param.chunks_per_block + 7) / 8;
return dev->chunk_bits + (dev->chunk_bit_stride * (blk - dev->internal_start_block));
//获取当前block在位图数组的首地址
}
yaffs_verify_chunk_bit_id(dev, blk, chunk);
//此处chunk: 当前block上的第几个chunk
blk_bits[chunk / 8] |= (1 << (chunk & 7)); //chunk/8指该chunk在block所占用的位图的第几个字节上,将这个字节的chunk_bit置位,表示己被占用
}
注意: (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
void yaffs_clear_chunk_bit(struct yaffs_dev *dev, int blk, int chunk)
{
u8 *blk_bits = yaffs_block_bits(dev, blk);
yaffs_verify_chunk_bit_id(dev, blk, chunk);
blk_bits[chunk / 8] &= ~(1 << (chunk & 7)); //知道了设置,那么释放很自己就是将这一位清0了
}
4. 批量操作
void yaffs_clear_chunk_bits(struct yaffs_dev *dev, int blk)
{
u8 *blk_bits = yaffs_block_bits(dev, blk);
memset(blk_bits, 0, dev->chunk_bit_stride); //将整个block所占位图中的Bytes都清0
}
每个block都会在chunk_bits数组中占几个字节, 字节每个bit指代了该block上的chunk的分配状态(0-示分配; 1-己分配)
1. 初始化
yaffs_guts_initialise
--> yaffs_init_blocks
static int yaffs_init_blocks(struct yaffs_dev *dev)
{
//chunks_per_block=128, 1个chunk 1个bit,那么128个chunk需要用16B来表示
dev->chunk_bit_stride = (dev->param.chunks_per_block + 7) / 8;
dev->chunk_bits = kmalloc(dev->chunk_bit_stride * n_blocks, GFP_NOFS); //所以chunk_bits数组需要16B*n_blocks
if (!dev->chunk_bits) {
dev->chunk_bits = vmalloc(dev->chunk_bit_stride * n_blocks);
dev->chunk_bits_alt = 1;
} else {
dev->chunk_bits_alt = 0;
}
if (!dev->chunk_bits)
goto alloc_error;
memset(dev->block_info, 0, n_blocks * sizeof(struct
yaffs_block_info));
memset(dev->chunk_bits, 0, dev->chunk_bit_stride * n_blocks);
return YAFFS_OK;
}
2. 设置
当调用yaffs_alloc_chunk分配一个chunk时就会在位图数组中设置一位,标识着该chunk己被占用
yaffs_set_chunk_bit(dev, dev->alloc_block, dev->alloc_page);
{
//参数: dev
// dev->alloc_block: 要分配chunk的block
// dev->alloc_page: 要分配的chunk号
//返回: 当前block在chunk_bits数组中的地址
u8 *blk_bits = yaffs_block_bits(dev, blk);
{
if (blk < dev->internal_start_block || blk > dev->internal_end_block)
;
//yaffs_init_blocks中赋值:
//dev->chunk_bit_stride = (dev->param.chunks_per_block + 7) / 8;
return dev->chunk_bits + (dev->chunk_bit_stride * (blk - dev->internal_start_block));
//获取当前block在位图数组的首地址
}
yaffs_verify_chunk_bit_id(dev, blk, chunk);
//此处chunk: 当前block上的第几个chunk
blk_bits[chunk / 8] |= (1 << (chunk & 7)); //chunk/8指该chunk在block所占用的位图的第几个字节上,将这个字节的chunk_bit置位,表示己被占用
}
注意: (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
void yaffs_clear_chunk_bit(struct yaffs_dev *dev, int blk, int chunk)
{
u8 *blk_bits = yaffs_block_bits(dev, blk);
yaffs_verify_chunk_bit_id(dev, blk, chunk);
blk_bits[chunk / 8] &= ~(1 << (chunk & 7)); //知道了设置,那么释放很自己就是将这一位清0了
}
4. 批量操作
void yaffs_clear_chunk_bits(struct yaffs_dev *dev, int blk)
{
u8 *blk_bits = yaffs_block_bits(dev, blk);
memset(blk_bits, 0, dev->chunk_bit_stride); //将整个block所占位图中的Bytes都清0
}
相关文章推荐
- linux awk命令详解
- Linux内核---24.yaffs2中chunk的分配与释放
- Linux内核---23.yaffs2文件系统(未完成)
- Linux内核---22.mkyaffs2image
- Linux内核---21.Linux下的dnw
- Linux内核---20.vfat文件系统分析
- Linux内核---19.S3C6410制作SD卡上的Linux文件系统
- linux sed命令详解
- Ubuntu 修复Grub引导双系统
- Ubuntu Kylin 16.04 下wps文字/wps表格/wps演示不能输入中文的解决办法
- linux ip
- linux下查看当前用户的 三个命令
- linux中sort命令
- linux make
- linux 环境下mysql忽略大小写
- Linux程序调试——调试工具及命令
- linux 启动 关闭 防火墙
- GDB十分钟教程
- 每日一linux命令(23)-------Linux 目录结构
- 经验分享之使用vagrant安装linux虚拟机