노무현 대통령 배너


2006. 7. 20. 14:25

kmalloc, kfree, vmalloc, vfree

* kmalloc(), kfree()

. 할당 가능한 최대 크기 = 32 * PAGE_SIZE = 32 * 4K(4096) = 131072Byte

. 할당된 메모리의 특성을 주거나 메모리 할당 시점에 처리 방식을 매개변수값으로 줄 수 있다.

. GFP_KERNEL

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

. 커널이 관리하는 메모리가 충분치 않을 경우에는(남은 메모리가 min_free_page보다 작을 경우) 디바이스 드라이버를 호출한 프로세스가 멈추고, 동적 메모리를 할당할 수 있는 상태가 될 때까지 잠든다.

. 이런 특성 때문에 kmalloc()함수를 인터럽트 서비스에 사용할 때는 이 값을 사용하면 안된다.

. GFP_ATOMIC

. 커널에 할당 가능한 메모리가 없으면 즉시 NULL을 반환한다.

. GFP_DMA

. 연속된 물리 메모리를 할당받을 때 사용한다.

. 디바이스 드라이버가 동작하는 메모리 공간은 물리적 메모리가 아닌 가상 주소 메모리이므로 실제 물리적 공간은 분할되어 있을 수 있다. 이럴 때는 GFP_DMA를 사용하면 된다.

. kmalloc(32 * PAGE_SIZE, GFP_KERNEL);

* vmalloc(), vfree()

. kmalloc() 함수는 할당 크기가 제한되어 있지만, vmalloc() 함수는 가상 공간이 허용하는 한 크기 제한 없이 할당받을 수 있다.

. vmalloc() 함수에서 할당받은 주소에 대한 실제(물리적) 주소를 얻고자 한다면 vmalloc() 함수는 가상 주소 공간에서 할당받기 때문에 해당 주소의 영역이 하드디스크에 있을 수도 있어 실패할 수 있다.

. 큰 연속 공간을 할당하기 위해 가상 메모리 관리 루틴이 수행되기 때문에 매우 느리다.

. 인자를 줄 수 없어 인터럽트 안에서 잠들 수도 있다.

. vmalloc(33 * PAGE_SIZE);