-
디바이스 드라이버 / 메모리 풀Linux/Linux Device Driver 2020. 9. 1. 12:40
pi@raspberrypi:~/Documents/mempool $ nano mempool.c
#include <linux/init.h> #include <linux/module.h> #include <linux/kernel.h> #include <linux/slab.h> #include <linux/mempool.h> #define MIN_ELEMENT 2; #define TEST_ELEMENT 4; typedef struct { int number; char string[128]; }TMemElement; int elementcount = 0; void* mempool_alloc_test(unsigned int gfp_mask, void* pool_data) { TMemElement* data; printk("----> call mempool_alloc_test\n"); data = kmalloc(sizeof(TMemElement), gfp_mask); if(data != NULL) { data->number = elementcount++; } return data; } void mempool_free_test(void* element, void* pool_data) { printk("----> call mempool_free_test\m"); if(element != NULL) { kfree(element); } } int memorypool_init(void) { mempool_t* mp; TMemElement* element[TEST_ELEMENT]; int lp; printk("module memory pool test start\n"); memset(element, 0, sizeof(element)); printk("call mempool_create\n"); mp = mempool_create(MIN_ELEMENT, mempool_alloc_test, mempool_free_test, NULL); printk("mempool allocate\n"); for(lp = 0; lp < TEST_ELEMENT; lp++) { element[lp] = mempool_alloc(mp, GFP_KERNEL); if(element[lp] == NULL) { printk("alloc fail\n"); } else { sprintf(element[lp] -> string, "alloc data %d\n", element[lp] -> number); printf(element[lp] -> string); } } printk("mempool free\n"); for(lp = 0; lp < TEST_ELEMENT; lp++) { if(element[lp] != NULL) { mempool_free(element[lp], mp); } } printk("call mempool_destroy\n"); mempool_destroy(mp); return 0; } void memorypool_exit(void) { printk("module memory pool test end\n"); } module_init(memorypool_init); module_exit(memorypool_exit); MODULE_AUTHOR("icjk1003@gmail.com"); MODULE_LICENSE("GPL");
pi@raspberrypi:~/Documents/mempool $ nano Makefile
obj-m := mempool.o KDIR := /lib/modules/$(shell uname -r)/build PWD := $(shell pwd) default: make -C $(KDIR) M=$(PWD) modules clean: make -C $(KDIR) M=$(PWD) clean
pi@raspberrypi:~/Documents/mempool $ make
pi@raspberrypi:~/Documents/mempool $ sudo insmod mempool.ko
pi@raspberrypi:~/Documents/mempool $ sudo rmmod mempool
pi@raspberrypi:~/Documents/mempool $ dmesg
module_memory pool test start
call mempool_create
----> call mempool_alloc_test
----> call mempool_alloc_test
mempool allocate
----> call mempool_alloc_test
alloc data 4
----> call mempool_alloc_test
alloc data 5
----> call mempool_alloc_test
alloc data 6
----> call mempool_alloc_test
alloc data 7
mempool free
----> call mempool_free_test
----> call mempool_free_test
----> call mempool_free_test
----> call mempool_free_test
call mempool_destroy
----> call mempool_free_test
----> call mempool_free_test
module memory pool test end
성공..
코드 실행결과를 보면 mempool_create() 함수로 2개의 공간을 먼저 확보하고 mempool_alloc() 함수로 4개의 공간을 더 확보 했다. 만약 공간이 부족해 mempool_alloc() 함수가 할당에 실패하면 미리 확보한 공간을 가져와 사용한다.
코드 해석
mempool_create() 함수가 실행되면 mempool_alloc_test() 함수를 실행해 MIN_ELEMENT개 만큼 공간을 확보한다.
mempool alloc() 함수가 실행되면 mempool_alloc_test() 함수를 실행해 공간을 확보한다. 만약 할당에 실패하면 mempool_create() 함수로 만들어 놓은 공간을 가져온다. 이런 방식 때문에 mempool_alloc() 함수는 절대 실패하지 않는다. 이는 프로세스가 메모리를 할당받다가 잠드는 문제를 방지한다. 물론 mempool_create() 함수로 할당받은 공간을 모두 소모하면 실패한다.
'Linux > Linux Device Driver' 카테고리의 다른 글
디바이스 드라이버 / 부 번호에 의한 파일 처리 (0) 2020.09.01 디바이스 드라이버 / 주 번호에 의한 파일 처리 (0) 2020.09.01 디바이스 드라이버 / 동적 메모리 할당 (0) 2020.09.01 디바이스 드라이버 / 매개변수 지정 (0) 2020.09.01 디바이스 드라이버 / 개발 시 고려사항 (0) 2020.09.01