分类: LINUX
2015-07-23 00:27:11
Bitmap中共有以下两个位图结构:
1. 磁盘位图,一级位图,保存在bitmap->filemap数组中,而bitmap->filemap_attr描述每个bitmap->filemap数组元素的状态;
说明:在md设备创建时,整个bitmap磁盘文件会被映射到内存,保存在filemap中,描述底层磁盘大小的位图,在这里1bit对应底层磁盘一个chunk;
其中filemap_attr数组每4bit对应filemap的一页(最小为sizeof(unsigned long))。Bitmap->filemap[0]被保存在bitmap->sb_page中,描述超级块信息。
2. 内存位图,二级位图,保存在bitmap->bp数组中,每一项数组元素中的map指针指向一个页,该页保存bitmap的一个内存位图结构(1个page描述2048个chunk);
说明:每个bp数组所描述的一个页(4096B)代表的2048个chunk,即2B代表1个chunk,2B 16位用来描述下面的信息:
NEEDED_MASK:1<<(COUNTER_BITS-1)
RESYNC_MASK:1<<(COUNTER_BITS-2)
COUNTER_MAX:RESYNC_MASK-1
一个chunk对应md中的一个条带,在位图中一个chunk占用2B=16bit:
1. 最高一位为是否需要同步标志,标志md对应条带是否需要同步;
2. 后面一位标志指针对应条带是否正在进行同步操作;
3. 低14位是一个计数器,表示对应条带内正在进行写操作的个数,其中0、1、2为特殊中,当为3时表示有1个写操作,4时有2个写操作,以此类推。
如下图所示:
* +----------------+---------------+------------------+
* | resync needed | resync active | counter |
* | (0-1) | (0-1) | (0-16383) |
* +----------------+---------------+------------------+
磁盘位图
其计算公式如下:
1. Bitmap->filemap 的page个数计算公式:
Num_pages=((chunks + sizeof(bitmap_super_t)<<3 + 7) / 8) + PAGE_SIZE
- 1) / PAGE_SIZE;
这个公式表示一个page的每一个size(0-4095B)代表8个chunks,相当于一个bit代表一个chunk;
page指向bitmap->filemap[page_index];chunk的计算方法见内存位图部分。
2. bitmap->filemap_attr:可以用来描述bitmap->filemap[page]的状态,这里为每个page申请了4bit的内存空间,
不过此部分计算时,最少申请的长度为unsigned long,filemap的状态有:
BITMAP_PAGE_DIRTY=0; //表示该bit位对应的数据已经写完,可以下刷到磁盘了
BITMAP_PAGE_CLEAN=1; //表示该bit位需要清除
BITMAP_PAGE_NEEDWRITE=2; //表示该bit刚刚被清除,数据需要向下刷
未完 -- 待续。