kernel 에서의 memory allocation 은 user space 에서와 무엇이 다를까?
기본적으로 api로 제공하는 함수는 kmalloc, vmalloc 이 있다.
kmalloc 의 경우 큰 특징이 있는데 바로 physical memory 에 바로 매핑이 된다는 것이다.
USER SPACE MEMORY ALLOCATION

흔히 사용자 혹은 프로그래머가 user space에서 malloc과 같은 함수를 호출하게 되면 process 마다 갖고있는 process address space에서 메모리를 할당받는다. 이는 실제 physical memory에 할당 받은 것이 아닌 가상주소공간을 할당받은 것이기 때문에 첫 참조시 page table을 참조해 memory에 없다는 것을 확인 후 page fault가 일어나고 그 후 매핑이 된다. 이때 physical memory에서의 연속성은 보장할 수 없다.
KERNEL SPACE MEMORY ALLOCATION
kmalloc의 경우 바로 physical memory를 할당받는 것이기 때문에 물리적 주소공간을 초과할 수 없다는 특징이 있다. 장점으로는 실제 주소 공간이 매핑되기 때문에 연속한 주소공간을 할당 받았다면, 물리적으로 연속적이다. DMA를 수행할 경우 device는 특정 영역내의 연속한 주소공간을 사용하기 때문에 kmalloc을 사용한다.
kmalloc의 다른 특징은 flag 설정이 가능하단 것인데 간단하게 3개만 보고 가자.(아는게 3개 뿐이다)

flag는 kmalloc(size_t size, int flag)의 두번째 parameter로 GFP_KERNEL의 경우 memory allocation 이 가능하지 않을 경우 해당 request를 보낸 process를 wait시킨 후 가용할 시 memory allocation을 해준 후 process wakeup을 시킨다. 이 flag를 사용할 때 kernel 내부의 작업이 process context가 아니라면 커널이 죽어버릴 수도 있다는 점을 주의하자
GFP_ATOMIC의 경우 memory allocation이 불가능 할 경우 NULL을 return 해준다.
vmalloc 의 경우엔 user space 에서의 memory allocation 과 유사하다. kernel virtual address space 에 연속적인 공간을 할당한다. 따라서 실제 가용 memory 보다 더 많은 영역을 할당 받을 수 있지만 DMA 와 같은 용도로는 부적합하다.

댓글 없음:
댓글 쓰기