2012-09-24 2 views
7

KMALLOC은 페이지 크기 메모리에만 할당합니까? 아니면 할당 할 수 있습니까? kmalloc이 할당 할 수있는 크기는 무엇입니까? 어디서나 볼 수 있듯이 실제로 할당량이 얼마나되는지는 알 수 없으므로 어디에서 설명을 찾을 수 있습니까? 내가 알고 싶은 것은 KMALLOC이 할당 한 실제 크기입니다. 2의 거듭 제곱 크기를 할당합니까? 준비가 완료된 캐시에서 무료 개체를 찾을 수 있습니까?KMALLOC 크기 할당

+2

'kmalloc()'의 소스 코드는이 모든 정보를 제공합니다. 할당 된 메모리의 실제 크기는 [ksize() 함수] (http://lxr.free-electrons.com/ident?i=ksize)를 참조하십시오. 경우에 따라,'kmalloc()'은 실제로 적절한 캐시에서 자유 오브젝트를 찾는다. 때로는 전체 페이지 할당에 의존한다. 예,'kmalloc'은 실제 크기가 페이지보다 작은 블록을 할당 할 수 있습니다. 구현은 시간이 지남에 따라 변하기 때문에 다른 문서를 찾는 것보다'kmalloc()'의 소스 코드를 분석하는 것이 더 유용 할 수 있습니다. – Eugene

답변

10

필자의 이해는 다음과 같습니다. 커널이 시스템의 물리적 메모리를 다루고 있으며 페이지 크기의 청크에서만 사용할 수 있습니다. 그러므로 kmalloc()으로 전화를 걸면 사전 정의 된 고정 크기 바이트 배열 만 얻게됩니다.

실제 메모리는 시스템 아키텍처에 따라 다르지만 kmalloc이 처리 할 수있는 가장 작은 할당은 32 또는 64 바이트입니다. kmalloc() 이상의 전화를 요청한만큼 (보통은 그 이상) 다시 전화 할 수 있습니다.

getconf PAGESIZE 

또는

getconf PAGE_SIZE 
: 일반적으로 당신은 당신이 명령을 실행할 수있는 시스템의 (다시 따라 아키텍처) 이상의 128킬로바이트

이 (바이트) 페이지 크기를 얻으려면을받지 않습니다 최대 페이지 크기에

이 정보는 /usr/src/linux/include/linux/slab.h

에 그리고 네, 페이지 크기는 2의 거듭 제곱은 일반적으로, 그러나 다시, 당신은 얻을 않을거야 정확하게 당신이 요구하는 것,하지만 조금 더. 할당 된 메모리의 실제 양을 표시하려면

void * stuff; 
stuff = kmalloc(1,GFP_KERNEL); 
printk("I got: %zu bytes of memory\n", ksize(stuff)); 
kfree(stuff); 

:

당신은이 같은 일부 코드를 사용할 수 있습니다

[90144.702588] I got: 32 bytes of memory 
2
당신이 kmalloc() INT 시스템에서 사용하는 몇 가지 일반적인 크기를 볼 수 있습니다

:

cat /proc/slabinfo | grep kmalloc 

kmalloc이 페이지를 할당하는 것보다 페이지를 더 할당하는 것이 문제입니다. kmalloc()을 원자 문맥 (GFP_ATOMIC 플래그)으로 호출하는 경우 메모리에서 인접한 페이지를 찾지 못하거나 시도하지 않을 것입니다 따라서 메모리가 매우 조각화되어 있고 할당 순서가 높은 경우 (allocation size → pagesize*2^(allocation order))이면 할당이 실패 할 수 있습니다. 따라서 원자 적 맥락에서 큰 할당은 실패 할 것입니다.

this other SO question about maximum AF_UNIX datagram size에 주문 7 (512 Kb) 할당 실패 예가 있습니다.

2

모두 커널에서 사용되는 할당 자에 따라 다릅니다. Slab, Slub 또는 Slob. 커널 구성 변수 다음을 참조하십시오

CONFIG_SLAB 
CONFIG_SLUB 
CONFIG_SLOB 

를 위의 모든 할당 자이 인 kmalloc()의 최대 한도를 결정하는 MAX_ORDERPAGE_SHIFT를 사용

은 SLAB 할당 자에 의해 지원되는 가장 큰 kmalloc이 크기 32 메가 바이트 (2^25) 또는 32MB보다 작 으면 할당 할 수있는 최대 페이지 순서.

#define KMALLOC_SHIFT_HIGH  ((MAX_ORDER + PAGE_SHIFT - 1) <= 25 ? \         (MAX_ORDER + PAGE_SHIFT - 1) : 25) 
#define KMALLOC_SHIFT_MAX  KMALLOC_SHIFT_HIGH 

SLUB은 주문 1 페이지 (PAGE_SIZE * 2)에 맞는 요청을 직접 할당합니다. 더 큰 요청은 페이지 할당 자에게 전달됩니다.

#define KMALLOC_SHIFT_HIGH  (PAGE_SHIFT + 1) 
#define KMALLOC_SHIFT_MAX  (MAX_ORDER + PAGE_SHIFT) 

SLOB은 한 페이지보다 큰 모든 요청을 페이지 할당 자에게 전달합니다. 크기가 다른 객체를 동일한 페이지에서 할당 할 수 있으므로 kmalloc 배열이 필요하지 않습니다. kmalloc이()에 의해

#define KMALLOC_SHIFT_HIGH  PAGE_SHIFT 
#define KMALLOC_SHIFT_MAX  30 

최대 할당 가능한 크기 인 kmalloc에서

#define KMALLOC_MAX_SIZE  (1UL << KMALLOC_SHIFT_MAX) 

최소 할당 가능한 크기() 슬래브

#define KMALLOC_MIN_SIZE (1 << KMALLOC_SHIFT_LOW) 

기본 KMALLOC_SHIFT_LOW 5입니다이며, 슬러브과 그것을 진흙

관련 문제