URL
EMBED
Page 0:
Page 1: 제 7 장 커널 메모리 할당
kmalloc의 실제 동작 Lookaside Caches vmalloc과 관련함수 Boot-Time Allocation
Page 2: kmalloc
kmalloc
flags 인자
GFP_KERNEL
커널의 메모리 할당 정책에 완전히 따른다. 메모리 부족 등의 이유로 sleep할 수도 있음. 프로세스 문맥 밖(즉, 인터럽트 핸들러, 태스크 큐, 커널 타이머)에서 호 출되어서는 안됨.
Linux Device Drivers
2
Page 3: kmalloc(계속)
flags 인자(계속)
GFP_ATOMIC
프로세스 문맥 밖에서 호출될 수 있음. 사용 가능한 모든 메모리를 활용하여 즉시 할당. low-water mark로 확보된 메모리까지도 사용한다. swapout이나 sleep은 허용되지 않음
__GFP_DMA
디바이스와 직접 입출력되는 DMA 용 메모리 할당 시 사용한다. GFP_KERNEL이나 GFP_ATOMIC과 같이 사용되어야 한다. __GFP_HIGHMEM requests high memory, a platform-dependent feature.
리눅스 드라이버에서 사용 가능한 Memory zones
DMA-capable memory Normal memory High Memory
Linux Device Drivers
3
Page 4: kmalloc(계속)
size 인자
바이트 단위이지만 page 경계를 맞추는 것이 좋다. overhead를 고려하여 PAGE_SIZE보다 약간 작은 값이 메모리 효율을 좋게 함.
예) 4096보다는 4000. 2048보다는 2000
최대 128KB(32 페이지)까지 가능
Linux Device Drivers
4
Page 5: Lookaside Caches
디바이스 드라이버 차원에서는 보통 메모리 캐쉬 관리를 안 함! 단, 예외의 경우가 USB와 ISDN 드라이버 임! Linux memory cache 구조체 : kmem_cache_t 캐쉬 생성 커널 함수 kmem_cache_create
creates a new cache object that can host any number of memory areas all of same size, specified by the size argument. name : cache 영역 ID에 해당. 최대 20 문자까지 가능. offset : offset of the first object in the page. 특수 alignment 시 사용됨.
Linux Device Drivers
5
Page 6: Lookaside Caches(계속)
flags
SLAB_NO_REAP SLAB_HWCACHE_ALIGN SLAB_CACHE_DMA optional 임.
constructor / destructor : pre-initializing / post-cleanup 기능.
캐쉬 내 메모리 할당 / 반환 함수
void *kmem_cache_alloc(kmem_cache_t *cache, int flags); void kmem_cache_free(kmem_cache_t *cache, const void *obj); int kmem_cache_destroy(kmem_cache_t *cache);
Linux Device Drivers
6
Page 7: Lookaside Caches(계속)
캐쉬 메모리 생성 / 파괴 / 할당 /반환 예
생성
파괴
Linux Device Drivers
7
Page 8: Lookaside Caches(계속)
캐쉬 메모리 생성 / 파괴 / 할당 /반환 예(계속)
할당
반환
Linux Device Drivers
8
Page 9: 페이지 단위 커널 메모리 할당 기법
큰 커널 메모리를 한꺼번에 할당하려면 페이지 단위의 할당 이 유리!
페이지 단위 할당 /반환 함수
flags 인자 : kmalloc과 같음. 대개의 경우 GFP_KERNEL이나 GFP_ATOMIC이 사용됨.
order : 할당/반환할 페이지 수의 2의 지수(예: 8 페이지이면 3). 최 대 값은 5임. 할당 요청 후 언제 할당 성공 여부를 확인해야 한다. 한 모듈이 너무 많은 커널 메모리를 소모하면 성능이 떨어짐.
Linux Device Drivers
9
Page 10: 페이지 단위 커널 메모리 할당 기법(계속)
페이지 단위 커널 메모리 할당 / 반환 예
할당
반환
Linux Device Drivers
10
Page 11: vmalloc
가상주소 공간에서 연속적인 커널 메모리를 할당하고자 할 때 사용함
단, 물리 메모리는 연속적이지 않을 수 있음. DMA 메모리로 사용할 수 없음. 관련 함수
#include <linux/vmalloc.h> void *vmalloc(unsigned long size); vod vfree(void *addr); void *ioremap(unsigned long offset, unsigned long size); void iounmap(void *addr);
할당 크기는 페이지 단위로 올림 됨. 소프트웨어적으로 필요한 큰 연속 커널 버퍼를 할당하고자 할 때. 커널 페이지 테이블을 수정해야 하므로 overhead가 큰 함수임.
Linux Device Drivers
11
vmalloc의 주 용도
Page 12: vmalloc(계속)
ioremap의 주 용도 : 인자로 지정한 주소로 매핑되는 페이지 테 이블을 만들 수 있어 PCI 메모리 같은 하드웨어 메모리를 매핑할 때 사용될 수 있음. ioremap이 리턴한 주소를 직접 액세스하는 것은 바람직하지 않 음
readb 등의 하드웨어 메모리 액세스 함수를 사용하는 것이 좋다. 페이지 테이블 공간을 위해 kmalloc(GFP_KERNEL)을 사용하므로, 인터럽트 문맥에서는 사용할 수 없다.
vmalloc의 불편한 점
Linux Device Drivers
12
Page 13: vmalloc(계속)
vmalloc을 사용한 커널 메모리 할당 /반환 예
할당
반환
Linux Device Drivers
13
Page 14: Boot-Time Allocation
부트 시 커널 메모리를 미리 확보한다는 의미
아주 큰 메모리도 할당할 수 있다. 지저분한 방법이므로 바람직하지는 않음. 모듈은 부트 시 메모리 할당이 안되므로, built-in 드라이버에서 만 부트 시 할당할 수 있다. 단점 : 할당한 메모리를 영원히 반환할 수 없다. 관련 함수
Linux Device Drivers
14
Page 15: