프로그래밍/리눅스 시스템
[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가능하다!