KMALLOC은 페이지 크기 메모리에만 할당합니까? 아니면 할당 할 수 있습니까? kmalloc이 할당 할 수있는 크기는 무엇입니까? 어디서나 볼 수 있듯이 실제로 할당량이 얼마나되는지는 알 수 없으므로 어디에서 설명을 찾을 수 있습니까? 내가 알고 싶은 것은 KMALLOC이 할당 한 실제 크기입니다. 2의 거듭 제곱 크기를 할당합니까? 준비가 완료된 캐시에서 무료 개체를 찾을 수 있습니까?KMALLOC 크기 할당
답변
필자의 이해는 다음과 같습니다. 커널이 시스템의 물리적 메모리를 다루고 있으며 페이지 크기의 청크에서만 사용할 수 있습니다. 그러므로 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
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) 할당 실패 예가 있습니다.
모두 커널에서 사용되는 할당 자에 따라 다릅니다. Slab, Slub 또는 Slob. 커널 구성 변수 다음을 참조하십시오
CONFIG_SLAB
CONFIG_SLUB
CONFIG_SLOB
를 위의 모든 할당 자이 인 kmalloc()의 최대 한도를 결정하는 MAX_ORDER 및 PAGE_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입니다이며, 슬러브과 그것을 진흙
- 1. kmalloc : 4 바이트 만 할당
- 2. 은 자동으로 해제 된 kmalloc()에 의해 할당 된 메모리입니까?
- 3. 리눅스 slall에서 8192 이상의 kmalloc
- 4. 동적으로 할당 된 배열의 크기
- 5. 벡터 선언 및 크기 할당
- 6. 조건에 따라 배열 크기 할당
- 7. 확장시 wx.CollapsiblePane에 sizer에서 더 많은 크기 할당
- 8. GPU에서 메모리 크기 할당 - OpenGL 텍스처로드 질문
- 9. 잘못된 할당 크기 (파생 클래스 복사 생성자에서)
- 10. C++에서 크기 0으로 메모리 할당?
- 11. 안드로이드 - ImageView에 비트 맵 할당 크기 변경
- 12. Java 사용 된 힙 대 할당 된 개체 크기
- 13. malloc()/free() 할당 된 크기 및 주소를 저장합니까?
- 14. malloc을 사용하지 않고 포인터에 고정 크기 객체 할당
- 15. SQLite 인 메모리 데이터베이스에 할당 된 메모리의 크기
- 16. UNIX에서 C++ 프로그램에 할당 된 초기 힙 크기
- 17. UITableViewCell textLabel 너비 크기 오류 표현식을 할당 할 수 없습니다.
- 18. 할당 된 주소에서 구조를 인스턴스화하십시오 (할당 할당)
- 19. 리소스 할당/할당 해제
- 20. 이진 배열 빠른 할당
- 21. , 할당
- 22. 할당
- 23. lodePNG 메모리 할당 오류
- 24. 할당 연산자 C++ NULL 할당
- 25. Perl 평가에서 변수 할당 할당
- 26. UINavigationControllerDelagate를 올바르게 할당/할당 해제
- 27. 버퍼 크기
- 28. 크기 조정 후 실제 이미지 크기 얻기
- 29. 계기 도구에서 할당 사용
- 30. 할당 큰 (5000) 배열
'kmalloc()'의 소스 코드는이 모든 정보를 제공합니다. 할당 된 메모리의 실제 크기는 [ksize() 함수] (http://lxr.free-electrons.com/ident?i=ksize)를 참조하십시오. 경우에 따라,'kmalloc()'은 실제로 적절한 캐시에서 자유 오브젝트를 찾는다. 때로는 전체 페이지 할당에 의존한다. 예,'kmalloc'은 실제 크기가 페이지보다 작은 블록을 할당 할 수 있습니다. 구현은 시간이 지남에 따라 변하기 때문에 다른 문서를 찾는 것보다'kmalloc()'의 소스 코드를 분석하는 것이 더 유용 할 수 있습니다. – Eugene