[완료] 커널API 중 kcalloc 과 kzalloc 의 차이가 뭔가요..?

maze의 이미지

kcalloc — allocate memory for an array. The memory is set to zero.
oid * kcalloc ( size_t n,
size_t size,
gfp_t flags);

kzalloc — allocate memory. The memory is set to zero.

void * kzalloc ( size_t size,
gfp_t flags);

설명은 위와같이 되어있습니다..
0으로 초기화 해주는건 같은데, 왜 저렇게 나누어 놓은건가요..?
잘 이해가 안갑니다... 답변좀 해주세요..ㅠ_ㅠ

dorado2의 이미지

http://lwn.net/Articles/147014/

이 링크가 도움이 되실 듯 하네요.

익명 사용자의 이미지

위 링크는 너무 쓸떼없이 말만 길게 늘어놓았군요

코드로 답변드릴게요

static inline void *kcalloc(size_t n, size_t size, gfp_t flags)
{
if (size != 0 && n > ULONG_MAX / size)
return NULL;
return __kmalloc(n * size, flags | __GFP_ZERO);
}

static inline void *kzalloc(size_t size, gfp_t flags)
{
return kmalloc(size, flags | __GFP_ZERO);
}

익명 사용자의 이미지

즉 위의 코드를 보자면

kcalloc 은 배열을 할당하는 구문으로 배열 array[5][6] 을 할당한다면
kcalloc(5, 6, GFP_KERNEL) 이 되겠네요

할당되는 크기는 5x6 = 30 이 될테고.
다만 두번쨰 인자 6은 0이면 안되고
할당되는 크기 (1번째 인자 X 2번째 인자) 의 크기가 unsigned long 의 크기를 넘어서면
메모리 할당이 실패하는 예외처리만 추가적으로 있는것 뿐이네요.

즉, 단순한 예외처리가 있는 배열메모리할당(동적인 할당) 함수가 kcalloc 인거죠