한 걸음씩..

Linux Driver 메모리 할당 - kmalloc / kfree 본문

프로그래밍

Linux Driver 메모리 할당 - kmalloc / kfree

반엘 2013. 7. 18. 09:00
할당 속도가 빠르고 사용법이 간단해 디바이스 드라이버에서 가장 많이 사용된다. 

 #include <linux/slab.h>

char *buff; 
buff = kmalloc(1024, GFP_KERNEL); 

if( buff != NULL )
{
kfree( buff );
else
{
printk( "kmalloc error\n ); 

사용법은 malloc(), free()함수와 유사하다. 

kmalloc()함수를 사용할 때는 할당 가능한 크기가 32xPAGE_SIZE라는 점에 주의해야 한다.

대부분의 시스템에서 PAGE_SIZE의 크기는 4096이므로 131072Byte 이상은 메모리를 할 당할 수 없다. 

malloc()함수와 다른점은 메모리 할 당시점에 처리 방식을 매개변수 값으로 준다. 


GFP_KERNEL : 동적 메모리 할당이 항상 성공하도록 요구


GFP_ATOMIC : 커널에 할당 가능한 메모리가 있으면 무조건 할당, 없으면 즉시 NULL반환 
                      프로세스가 잠드는 경우는 없지만 할당에 실패할 경우를 대비해 예외처리 필수 

GFP_DMA : 연속된 물리 메모리를 할당받을 때 사용

디바이스 드라이버가 동작하는 메모리 공간은 물리적인 메모리가 아닌 가상 주소 메모리. 

할당된 메모리를 프로세스 입장에서 보면 가장 주소 공간이 연속적으로 보여도 실제 물리적 공간은 분할되어 있을 수 있다. 

그런데 이렇게 물리적 공간이 여러 곳으로 나뉘어 있으면 DMA컨트롤러에서는 사용할 수 없다 이럴때 사용.