bitmap可以理解成一个位数组,即数组每个元素是一个bit, 内核提供了各种接口以方便操作
bitmap定义
#define DECLARE_BITMAP(name,bits) \
unsigned long name[BITS_TO_LONGS(bits)]
使用之前需要先调用这个宏定义一个bitmap,实际上就是一个unsigned long类型的数组,数组长度是根椐bits, 以及long类型所占字节数计算出来的。
bitmap操作函数
bitmap_zero(dst, nbits)
bitmap_fill(dst, nbits)
bitmap_copy(dst, src, nbits)
bitmap_and(dst, src1, src2, nbits)
bitmap_or(dst, src1, src2, nbits)
bitmap_xor(dst, src1, src2, nbits)
bitmap_set(dst, pos, nbits)
bitmap_clear(dst, pos, nbits)
内核中对位操作的两组函数也可以用于bitmap.
1.原子操作
set_bit(bit, addr)
clear_bit(bit, addr)
change_bit(bit, addr)
test_and_set_bit(bit, addr)
test_and_clear_bit(bit, addr)
test_and_change_bit(bit, addr)
test_bit(bit, addr)
2.非原子操作
__set_bit(bit, addr)
__clear_bit(bit, addr)
__change_bit(bit, addr)
__test_and_set_bit(bit, addr)
__test_and_clear_bit(bit, addr)
__test_and_change_bit(bit, addr)