ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 디바이스 드라이버 / 메모리 풀
    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() 함수로 할당받은 공간을 모두 소모하면 실패한다.

     

     

    댓글

Designed by Tistory.