位操作 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為要加權的字 一個數的加權平衡是這個數所有位的總和。 |