位操作
set_bit
在位图中原子地设置某一位
void set_bit (int nr, volatile void * addr)
nr为要设置的位,addr为位图的起始地址
这个函数是原子操作,如果不需要原子操作,则调用__set_bit函数,nr可以任意大,位图的大小不限于一个字。
__set_bit
在位图中设置某一位
void __set_bit (int nr, volatile void * addr)
nr为要设置的位,addr为位图的起始地址
clear_bit
在位图中清某一位
void clear_bit (int nr, volatile void * addr)
nr为要清的位,addr为位图的起始地址
该函数是原子操作,但不具有加锁功能,如果要用于加锁目的,应当调用smp_mb__before_clear_bit 或smp_mb__after_clear_bit函数,以确保任何改变在其他的处理器上是可见的。
__change_bit
在位图中改变某一位
void __change_bit (int nr, volatile void * addr)
nr为要设置的位,addr为位图的起始地址。
与change_bit不同,该函数是非原子操作。
change_bit
在位图中改变某一位
void change_bit (int nr, volatile void * addr)
nr为要设置的位,addr为位图的起始地址。
test_and_set_bit
设置某一位并返回该位原来的值
int test_and_set_bit (int nr, volatile void * addr)
nr为要设置的位,addr为位图的起始地址。
该函数是原子操作
__test_and_set_bit
设置某一位并返回该位原来的值
int __test_and_set_bit (int nr, volatile void * addr)
nr为要设置的位,addr为位图的起始地址。
该函数是非原子操作,如果这个操作的两个实例发生竞争,则一个成功而另一个失败,因此应当用一个锁来保护对某一位的多个访问。
test_and_clear_bit
清某一位,并返回原来的值
int test_and_clear_bit (int nr, volatile void * addr);
nr为要设置的位,addr为位图的起始地址。
该函数是原子操作
__test_and_clear_bit
清某一位,并返回原来的值
int __test_and_clear_bit (int nr, volatile void * addr);
nr为要设置的位,addr为位图的起始地址。
该函数为非原子操作
test_and_change_bit
改变某一位并返回该位的新值
int test_and_change_bit (int nr, volatile void * addr)
nr为要设置的位,addr为位图的起始地址。
该函数为原子操作
test_bit
确定某位是否被设置
int test_bit (int nr, const volatile void * addr)
nr为要测试的第几位,addr为位图的起始地址。
find_first_zero_bit
在内存区中查找第一个值为0的位
int find_first_zero_bit (void * addr, unsigned size)
addr为内存区的起始地址,size为要查找的最大长度
返回第一个位为0的位号
find_next_zero_bit
在内存区中查找第一个值为0的位
int find_next_zero_bit (void * addr, int size, int offset)
addr为内存区的起始地址,size为要查找的最大长度,offset开始搜索的起始位号。
ffz
在字中查找第一个0
unsigned long ffz (unsigned long word);
word为要搜索的字。
ffs
查找第一个已设置的位
int ffs (int x)
x为要搜索的字。
这个函数的定义方式与Libc中的一样。
hweight32
返回一个N位字的加权平衡值
hweight32 ( x)
x为要加权的字
一个数的加权平衡是这个数所有位的总和。