추천중입니다.
닫기 블로그로 보내기


설정된 블로그가 없습니다.

블로그 설정하기

슬라이드를 블로그에 보내는 중입니다.
리눅스 커널메모리 할당
0
017480
또리 2008.10.23 21:07:21
누군가 물어봐서 올립니다.
마가린 바르기bookmarkr.netmetagsWzd.com네이버에 북마크하기다음에 북마크하기HanRSS에 북마크하기이올린에 북마크하기Pumfit에 글 올리기News2.0에 투고하기del.icio.us에 북마크하기
URL Copy_btn
EMBED Copy_btn
작성자가 등록한 다른 큐
댓글을 작성하기 위해서는 먼저 로그인 하셔야 합니다.
현재 댓글의 수는 0 개 입니다.
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: