'slab'에 해당되는 글 2건

  1. 2008.06.10 2.6.24.17에서의 kmalloc
  2. 2008.06.10 SLUB에 관한 좋은 자료 (링크)

2.6.24.17에서의 kmalloc

Linux 2008. 6. 10. 13:56
몇개월동안 커널을 들여다보지 않았더니 그사이 또 많이 바뀐 느낌이다.  예전에 유영창씨의 "리눅스 디바이스 드라이버"에서

kmalloc (33 X PAGE_SIZE);


요게 안된다는 문구를 보고 왜 안되나, 어떻게하면 될 수 있나... 찾아보면서 그 구조를 알았다는 느낌이었는데 (SLAB allocator를 사용하지 않으면 가능) 이제와서 또 틀려졌으니 잠시라도 게을리하면 안되겠다는 생각이 든다.

kmalloc (1024 X PAGE_SIZE);


이게 되는 것이 아닌가? 혹시 SLAB allocator가 활성화안된건가? 컴파일 된 리눅스 소스 디렉토리로 가서 설정파일(.config)을 확인했더니

# CONFIG_SLAB is not set
CONFIG_SLABINFO=y
...
CONFIG_SLUB=y


음... SLAB allocator가 아니라 SLUB allocator를 사용하고 있는 것이로구나.  SLUB allocator 아래서 동작하는 kmalloc은 slub_def.h에 정의되어 있으며 __builtin_constant_p ()의 성공여부에 따라 달라지긴 여기서 바로 부르던 간에 아니면 __kmalloc ()을 호출하던간에 아래의 문맥은 또 나온다.

...
if (size > PAGE_SIZE)
    return kmalloc_large (size, flags);
...


음.  PAGE_SIZE가 현재 4096이니 만약 그것보다 큰 메모리를 할당받으려고 할 때는 kmalloc_large()가 호출이 된다.  kmalloc_large는 마찬가지로 slub_def.h에 선언이 되어있고,

...
return (void *) __get_free_pages (flags | __GFP_COMP, get_order (size));
...


이렇게 된다.  역시 결론은 __get_free_pages ()인가? __get_free_pages ()는 page_alloc.c에 정의되어있고, page를 할당받기 위해 gfp.h에 선언되어있는 alloc_pages ()를 호출한다.  alloc_pages ()는 page를 할당하기에 앞서 order를 검사한다.


...
if (unlikely (order >= MAX_ORDER))
    return NULL;
...


MAX_ORDER는 11로 define되어있고, 이 의미는 대략 다음과 같이 풀이될거다.

...
if (unlikely (size >= (PAGE_SIZE * 1024)))
    return NULL;
...


2의 10승이 1024이므로 여기에 PAGE_SIZE인 4096을 곱해주면

4194304byte = 4096KB = 4MB


고로, 4MB를 초과하는 메모리 (4MB + 1byte부터)는 kmalloc으로 할당이 불가능 하다는 이야기가 된다.  다음과 같이 테스트 해보니 명확해졌다.

buff = kmalloc (PAGE_SIZE * 1024 + 1, GFP_KERNEL);
if (buff != NULL)
{
    printk ("kmalloc 1 success!\n");
    free (buff);
}

buff = kmalloc (PAGE_SIZE * 1024, GFP_KERNEL);
if (buff != NULL)
{
    printk ("kmalloc 2 success!\n");
    free (buff);
}


다시 말하지만 현대기술은 날 기다려주지 않는건가 -.-;
Posted by 강군님

댓글을 달아 주세요

2.6.22부터 사용되어지고 있는 SLUB에 대해 정리되어있는 링크.

세월이 변하긴 하는구나 -.-;;

http://monac.egloos.com/1117183

아래는 SLUB allocator에 대한 article

http://lwn.net/Articles/229984/
Posted by 강군님
TAG linux, slab, slub

댓글을 달아 주세요