이번에는 커널에서 비트를 처리하기 위한 매크로들을 보겠습니다.
 커널에는 여러가지 편리한 매크로 들이 있습니다.
 네... 솔직히 폼도 납니다.^^
 무엇보다 일관적인 함수를 씀으로 인해 실수를 줄일수 있습니다.
 또 한가지는 아키텍쳐 별로 최적화된 함수를 제공한다는 것입니다.
 그리고 마지막으로 endian에 대한 처리 역시 해준다는 것입니다(이건 아키텍쳐 별로 다를수 있습니다.)
 
set_bit(nr, p) : 메모리 p 의 nr 번째 비트 set
clear_bit(nr, p) : 메모리 p 의 nr 번째 비트 clear
change_bit(nr, p) : 메모리 p 의 nr 번째 비트 toggle
test_and_set_bit(nr, p) : 메모리 p 의 nr 번째 비트를 set 시키고 바꾸기 이전 nr 번째 비트 값을 마스크시켜 리턴시킴.
test_and_clr_bit(nr, p) : 메모리 p 의 nr 번째 비트를 clear 시키고 바꾸기 이전에 nr 번째 비트 값을 마스크시켜 리턴시킴.
test_and_change_bit(nr, p) : 메모리 P 의 nr 번째 비트를 toggle 시키고 이전에 nr 번째 비트 값을 리턴시킴.
test_bit(nr, p) : 메로리 p 의 nr 번째 비트의 값을 리턴시킴.
find_first_zero_bit(p, sz) : 메모리 p 에서 첫번째 0 인 비트를 최대 sz 번째 비트까지 찾는다.
find_next_zero_bit(p, sz, off)         : 메모리 p 의 off 번째 비트부터 첫번째 찾은 0 인 비트값을 돌려줌
find_first_bit(p, sz) : 메모리 p 에서 첫번째 1 인 비트를 최대 sz 번째 비트까지 찾는다.
find_next_bit(p, sz, off) : 메모리 p 의 off 번째 비트부터 첫번째 찾은 1 인 비트값을 돌려줌


예제와 함께 결과를 보겠습니다.
----------------------------------------------------------------------------------------------------------
        pattern = 0;
        set_bit(3, &pattern);
        printk("pattern 0x%lx\n", pattern);
pattern 0x8 :  3번째 비트가 set 되었습니다.
----------------------------------------------------------------------------------------------------------
        pattern = 0xffffffff;
        clear_bit(3, &pattern);
        printk("pattern 0x%lx\n", pattern); 
    
pattern 0xfffffff7 : 3번째 비트가 clear 되었습니다.
----------------------------------------------------------------------------------------------------------
        pattern = 0x0;
        change_bit(3, &pattern);
        printk("pattern 0x%lx\n", pattern); 

pattern 0x8 :  3번째 비트가 toggle 되었습니다.
----------------------------------------------------------------------------------------------------------
        pattern = 0xffffffff;
        change_bit(3, &pattern);
        printk("pattern 0x%lx\n", pattern); 

pattern 0xfffffff7  :  3번째 비트가 toggle 되었습니다.
----------------------------------------------------------------------------------------------------------
        pattern = 0x0;
        before= test_and_set_bit(3, &pattern);
        printk("before 0x%x pattern 0x%lx\n", before, pattern); 
        before= test_and_set_bit(3, &pattern);
        printk("before 0x%x pattern 0x%lx\n", before, pattern); 

before 0x0 pattern 0x8   :  3번째 비트값을 set 시키고 이전 값의 3번째 비트 값을
mask 시켜 리턴함
before 0x8 pattern 0x8   :  3번째 비트값을 set 시키고 이전 값의 3번째 비트 값을
mask 시켜 리턴함
----------------------------------------------------------------------------------------------------------
        pattern = 0xffffffff;
        before= test_and_clear_bit(3, &pattern);
        printk("before 0x%x pattern 0x%lx\n", before, pattern); 
        before= test_and_clear_bit(3, &pattern);
        printk("before 0x%x pattern 0x%lx\n", before, pattern); 

before 0x8 pattern 0xfffffff7   :  3번째 비트값을 set 시키고 이전 값의 3번째 비트 값을
before 0x0 pattern 0xfffffff7 :  3번째 비트값을 set 시키고 이전 값의 3번째 비트 값을
   mask 시켜 리턴함
----------------------------------------------------------------------------------------------------------
        pattern = 0xffffffff;
        result = test_bit(3, &pattern);
        printk("result 0x%x\n", result);    

result 0x1  : 3번째 비트값을 리턴함
----------------------------------------------------------------------------------------------------------
        pattern = 0x7fffffff;
        result = find_first_zero_bit(&pattern, 32);
        printk("result %d\n", result);    

result 31 : 처음으로 찾은 0 비트는 31번째 비트입니다.
----------------------------------------------------------------------------------------------------------
        pattern = 0x7fffffe0;
        result = find_next_zero_bit(&pattern, 32, 5); 
        printk("result %d\n", result);    

result 31 : 5번비트부터 찾아 처음으로 찾은 0 비트는 31번째 비트입니다.
----------------------------------------------------------------------------------------------------------
        pattern = 0x80000000;
        result = find_first_bit(&pattern, 32);
        printk("result %d\n", result);    

result 31 : 처음으로 찾은 1 비트는 31번째 비트입니다.
----------------------------------------------------------------------------------------------------------
        pattern = 0x8000001f;
        result = find_next_bit(&pattern, 32, 5); 
        printk("result %d\n", result);    
        
result 31 : 5번비트부터 찾아 처음으로 찾은 1 비트는 31번째 비트입니다.
 ----------------------------------------------------------------------------------------------------------


이상과 같이 실제 리턴값과 함께 예제를 살펴 보았습니다.