ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Linux Kernel] Device Driver : 묘듈 분할
    프로그래밍/리눅스 시스템 2024. 4. 29. 05:39

     

    [Makefile]

    KERNEL_HEADERS=/lib/modules/$(shell uname -r)/build
    
    obj-m += common.o devicedriver.o
    
    PWD := $(CURDIR)
    
    all:
            make -C $(KERNEL_HEADERS) M=$(PWD) modules
    
    clean:
            make -C $(KERNEL_HEADERS) M=$(PWD) cleancopy

     

     

    ■ 두개 모듈 생성

    • device driver 코드를 2개의 모듈로 분할해서 작성해줌
      => 모든 소스코드를 obj-m으로 추가해주어야 한다!!

     

     

    [common.h]

    #ifndef COMMON_H
    #define COMMON_H
    
    int common_function(int value);
    
    #endif
    • 함수 정의
    • 변수 정의
    • 매크로 변수 정의 등등 공통으로 사용할 인터페이스를 작성한다.
      => common.h를 불러오면, 해당 인터페이스를 사용할 수 있게된다!

     

     

    [common.c]

    #include <linux/kernel.h>
    #include <linux/module.h>
    #include <linux/init.h>
    #include <linux/printk.h>
    #include "common.h"
    
    MODULE_LICENSE("GPL");
    MODULE_AUTHOR("SSAFY");
    
    int common_function(int value) {
        pr_info("Received value: %d\n", value);
        return value * 2;
    }
    
    EXPORT_SYMBOL(common_function);
    
    static int __init common_module_init(void) {
        pr_info("Common module loaded\n");
        return 0;
    }
    
    static void __exit common_module_exit(void) {
        pr_info("Common module unloaded\n");
    }
    
    module_init(common_module_init);
    module_exit(common_module_exit);copy

     

    • <linux/kernel.h> : 커널 모듈에서 사용 가능한 다양한 기능 및 도구 정의
    • MODULE_LICENSE() : 라이센스 등급 설정
    • MODULE_AUTHOR() : 모듈 개발자 소개
      • <linux/module.h>에 정의되어있다.
    • EXPORT_SYMBOL(공유할 함수/변수명) : 매크로. 인자로 들어온 함수 / 변수 등을 공유할 수 있도록 설정.
      (=> 다른 소스파일에서 common.h를 include해주면, 해당 함수로 export한 변수/함수를 사용할 수 있게된다!)

     

     

    [devicedriver.c]

    #include <linux/module.h>
    #include <linux/printk.h>
    #include <linux/init.h>
    #include "common.h"
    
    MODULE_LICENSE("GPL");
    
    static int __init devicedriver_init(void) {
        int result;
        pr_info("Insmod Module\n");
    
            result = common_function(10);
        pr_info( "Result from common_function: %d\n", result);
        return 0;
    }
    
    static void __exit devicedriver_exit(void) {
        pr_info("Unload Module\n");
    }
    
    module_init(devicedriver_init);
    module_exit(devicedriver_exit);

     

    ■ common_function 사용하기

    • common.h 헤더 추가
    • common_function() 사용할 수있다!

     

     

     

    동작 확인하기 : 공통 모듈부터 insmod 하기

    • 사용된 모듈이 있다면, 사용한 모듈먼저 insmod 해주어야 inmod가능하다!
Designed by Tistory.
-->