리눅스 & 안드로이드2011. 5. 24. 15:29
binder에 대한 내용을 공부하다 kzalloc이란 커널 메모리 할당 함수가 있어 찾아 보았다.

kcalloc과 kzalloc 모두 동일하게, 요청한 크기의 메모리를 0으로 초기화하여 반환한다.
그런데 왜 두 개의 함수로 나누어 놓았을까?

그 내용은 위의 kzalloc 링크에 설명되어 있듯이,
처음에는 kmalloc + memset의 기능을 하나로 합쳐 kcalloc으로 만들었다고 한다.

void *kcalloc(size_t n, size_t size, unsigned int __nocast gfp_flags);


그런데, 사용자들은 보통 kcalloc의 첫 번째 인자인 [size_t n]의 입력을 보통 1로 하여 호출하여, 원래의 기능인 (n * size) 크기의 메모리 할당이 (1 * size) 가되어 별 의미가 없다는 불평(?)이 있었다고 한다. (개인적으로도 헷갈리기만 하고 별 필요 없었다고 생각이 들었다. align을 편하게 하기위해 만든기능?)

그래서 나온 함수가 kzalloc.

void *kzalloc(size_t size, unsigned int __nocast gfp_flags);

 
위와 같이 kcalloc의 첫 번째 인자가 kzalloc에서는 사라졌다.
 
Posted by 세월의돌