달력

12

« 2024/12 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
2011. 10. 19. 00:43

vmalloc() OS이야기2011. 10. 19. 00:43

vmalloc()은 kmalloc()과 비슷하지만, 가상적으로는 연속이지만 물리적으로는 연속이 아니라는 점에서 다르다. 이것은 유저공간 할당방식이기도 하다. 즉, 유저영역에서의 malloc()함수에서 리턴되는 페이지는 프로세서으 ㅣ가상 주소 공간에서는 연속이지만, 이들이 물리적인 RAM에서 실제로 연속인지에 대해서는 아무런 장담을 할 수 없다.

대체로 하드웨어 장치만이 물리적으로 연속된 메모리르 필요로 하다. 하드웨어 디바이스는 메모리 관리 유닛과 동떨어져 있어 가상주소를 이해하지 못한다.
하지만, 소프트웨어에서만 사용되는 메모리 블록은 갓아적으로만 연속된 메모리를 사용해도 전혀 문제가 없다.

대부분의 커널코드는 메모리 할당을 하기위해 vmalloc()이 아닌 kmalloc()을 사용한다. 왜냐하면 바로 성능차이 때문이다.
vmalloc() 함수는 물리적으로 연속적이지 페이지를 가상주소공간에서 연속적으로 보이기 위해 어떤연산을 해야한다. vmalloc()으로 얻은 페이지는 각자으 ㅣ페이지에 의해 매핑되어야 하는데, 직접 매핑된 메모리를 쓸때보다 TLB 를 훨씬 많이 참조하게 된다. 이런 이유떄문에 vmalloc()꼭 필요한 경우, 특히 아주 커다란 메모리를 할당할 떄에만 사용된다.
예를들어, 모듈이 동적으로 커널에 포함되는 경우 이들 모듈은 vmalloc()을 통해 메모리에 로드한다.

vmalloc() 함수는 <linux/vmalloc.h>에 선언되고 mm/vmalloc.c에 정의되어있따. 사용법은 유저 공간의 malloc()함수와 동일하다.
void *vmalloc(unsigned long size)

이를 해제하려면 vfree(void *addr)을 사용한다.


char *buf
buf = vmalloc(16 * PAGE_SIZE);
vfree(buf); 

'OS이야기' 카테고리의 다른 글

kmem_pages(kmem_cache_t *cachep, int flags, int nodeid)  (0) 2011.10.20
슬랩 레이어  (0) 2011.10.19
kfree()  (1) 2011.10.19
kmalloc()  (0) 2011.10.19
페이지 얻기  (0) 2011.10.18
:
Posted by НooпeУ


Code Start Code End