커널 API
글 수 18
2010.11.23 00:37:57 (*.82.68.231)
27497
이번에는 커널에서 비트를 처리하기 위한 매크로들을 보겠습니다.
커널에는 여러가지 편리한 매크로 들이 있습니다.
네... 솔직히 폼도 납니다.^^
무엇보다 일관적인 함수를 씀으로 인해 실수를 줄일수 있습니다.
또 한가지는 아키텍쳐 별로 최적화된 함수를 제공한다는 것입니다.
그리고 마지막으로 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번째 비트입니다.
----------------------------------------------------------------------------------------------------------
이상과 같이 실제 리턴값과 함께 예제를 살펴 보았습니다.