일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
- Debugging
- Visual Studio Code
- GPIO
- 라즈베리파이
- raspberrypi
- Visual Studio
- 디버깅
- yocto
- AArch64
- C++
- avr-gcc
- Raspberry
- atmel
- nucleo
- 리눅스
- AVR
- USART
- vscode
- Debug
- platformio
- UART
- esp32
- Arduino
- QEMU
- Linux
- BeagleBone
- STM32
- 아두이노
- bare metal
- buildroot
- Today
- Total
임베디드를 좋아하는 조금 특이한 개발자?
[Linux Kernel Module] 개발 프로젝트 구성 본문
- 개발 환경
개발 보드 : Raspberrypi 4
OS : Linux raspberrypi 6.12.25
1. 서론
운영체제는 대략적으로 어플리케이션 영역과 커널 영역으로 분리되어 있습니다. 어플리케이션 영역에서 실행되는 프로그램은 하드웨어에 직접 접근할 수 없습니다. 그러므로 일반적인 프로그램은 커널 영역에 있는 모듈을 통해 하드웨어에 접근하고 있습니다. 이제 말을 조금 바꾸어 말하면 커널 모듈은 하드웨어와 어플리케이션 간의 인터페이스을 담당하고 있다고 말할 수 있습니다.
그러므로 새로운 디바이스를 개발한다고 한다면 해당 디바이스를 제어할 수 있는 커널 모듈을 개발해야합니다. 앞으로 커널 모듈을 개발하는 방법을 소개하면서 기능을 정리해보려고 합니다. 이번 포스트에서는 단순히 "Hello world" 로그를 출력하는 커널 모듈을 개발하면서 개발하기 위한 환경을 구성하도록 하겠습니다. 또한 누구나 쉽게 개발 할 수 있도록 "라즈베리파이 4" 보드를 선택했으며 "라즈베리파이 OS"로 개발을 진행하도록 하겠습니다.
2. 개발 환경 구축
2.1. 필요 패키지 설치 (라즈베리파이 사용시)
# APT 패키지 업데이트 및 업그레이드
sudo apt update
sudo apt upgrade -y
# Kernel 모듈 관련 헤더파일 다운로드
sudo apt install -y raspberrypi-kernel-headers
만약 다른 환경(다른 타겟 보드 및 운영체제)를 사용하신다면 해당 환경에 대한 리눅스 빌드 환경을 구축해야합니다.
2.2. 프로젝트 파일 구조
# 프로젝트 폴더 생성 및 이동
mkdir devModule && cd devModule
# 필요 파일들 생성
# Makefile : 모듈 빌드를 위한 파일
# firstModule.c : 실제 커널 모듈을 개발 하기 위한 파일
touch Makefile firstModule.c
- firstModule.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
#include <linux/module.h>
#include <linux/init.h>
static int __init initModule(void){
printk("[devModule] initModule : Hello world\n");
return 0;
}
static void __exit exitModule(void){
printk("[devModule] exitModule : Goodbye world\n");
}
module_init(initModule);
module_exit(exitModule);
MODULE_LICENSE("GPL");
|
cs |
- module_init()
모듈을 커널에 추가할 때 모듈을 초기화 할 함수를 지정하는 매크로 입니다. - module_exit()
모듈을 커널에서 제거할 때 해당 모듈에서 사용한 자원을 반납할 함수를 지정하는 매크로입니다. - printk()
모듈을 실행하면서 Log를 남기기 위한 함수 입니다.
dmesg 명령어를 통해 해당 Log를 확인 할 수 있습니다. - MODULE_LICENSE()
이 모듈에 대한 라이센스를 명시하는 매크로입니다.
- Makefile
1
2
3
4
5
6
7
|
obj-m += firstModule.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
|
cs |
firstModule.c 를 커널 모듈로 빌드하기 위한 Makefile 입니다.
주의)
반드시 obj-m에 firstModule.c의 파일 이름과 같은 이름으로 추가해야합니다.
3. 커널 모듈 빌드
make
firstModule.ko가 생성되었다는 것은 정상적으로 모듈을 빌드하였다는 것입니다.
4. 커널 모듈 동작 확인
# firstModule을 커널에 추가
sudo insmod firstModule.ko
# initModule에서 printk로 출력한 LOG 확인
dmesg | tail
# 현재 firstModule이 커널에 추가되었는지 확인
lsmod | grep firstModule
# 커널에 설치된 firstModule 제거
sudo rmmod firstModule
# printk로 출력 한 LOG 확인
dmesg | tail
5. 후기
지금까지 가장 간단한 커널 모듈을 개발하였습니다. 당장은 쉽지만 앞으로 기능(인터럽트, UART, I2C 등) 을 추가하면서 조금씩 어려워 질 것입니다. 또한 기본적으로 운영체제에 대한 이해가 필요하며 하드웨어를 직접적으로 제어하면서 하드웨어에 대한 이해 그리고 특히 리눅스 운영체제에 대한 이해가 필요할 것입니다.
하지만, 실습을 통해 천천히 개발해 나아가면 크게 어렵지 않게 따라 할 수 있을 것입니다.
'Embedded > Linux' 카테고리의 다른 글
[Linux Kernel Module] Character Device(문자 장치) 초기화 및 생성 (1) | 2025.08.11 |
---|---|
[Linux Debugging] VScode로 간편히 Linux 디버깅하기 (3) | 2025.08.05 |
[Linux Debugging] QEMU로 실행한 Linux를 GDB로 디버깅 (1) | 2025.08.05 |
[Linux Debugging] Buildroot를 통해 디버깅할 리눅스 빌드 (3) | 2025.08.03 |