프로그래밍/리눅스 시스템

[Linux Kernel] Device Driver : 묘듈 분할

KimuGamJa 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가능하다!