일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- socket
- i/o scheduling
- 라즈베리파이
- 우분투
- linux
- 네트워크
- scheduler
- 젠킨스
- MSA
- spring cloud eureka
- Spring cloud
- pthread_join()
- 소켓 프로그래밍
- 젠킨스 파이프라인
- pthread_create()
- position independent code
- 스케줄링
- scheduling
- SD카드
- eureka
- 스케줄러
- 포맷
- 리눅스
- spring eureka
- i/o schduler
- 소켓
- Jenkins
- 라즈베리파이 에러
- OS
- jenkins pipeline
- Today
- Total
dayne의 블로그
리눅스 모듈 종류 및 모듈 적용 방법 본문
목차
1. 리눅스에서 모듈이란
2. 리눅스 모듈의 종류
3. 리눅스 모듈 적용 방법
1. 리눅스에서 모듈이란
리눅스에서 모듈이란 일반적으로 '커널 모듈'을 의미합니다.
모듈은 '커널의 기능을 확장하거나 특정 하드웨어를 지원하기 위해 동적으로 로드하거나 언로드할 수 있는 독립적인 코드 조각(커널 구성요소)'입니다.
여러 하드웨어 드라이버를 커널 외부에 별도로 가지고 있기 때문에, 새로운 장치가 추가되어 드라이버가 필요할 경우 커널을 변경할 필요 없이, 해당 모듈만 커널에 적재해서 사용한 뒤, 끝났을 때 제거하면 됩니다.
이를 통해 커널이 필요한 드라이버를 모두 가지고 있지 않고, 필요한 시점에만 모듈을 로딩해서 사용한 후 언로딩하는 방식으로 효율성을 높인다는 것을 알 수 있습니다.
또한, 모듈을 사용하면 시스템을 재부팅하지 않고도 커널의 기능을 추가하거나 제거할 수 있기에 유연성과 효율성을 높일 수 있습니다.
리눅스 커널 모듈은 C컴파일러로 만들어진 오브젝트 파일로서 *.ko 형태로 생성되고 각 시스템에서 가능한 모듈은 lib/modules/커널버전/kernel 디렉토리 안에 생성되어 있습니다.
※ 일반 응용 프로그램과의 차이점
커널은 일반 응용 프로그램과 달리 main() 함수가 존재하지 않습니다.
대신, 커널에 로딩 및 언로딩될 때 호출되는 함수가 존재하는데, 이는 아래와 같습니다.
Loading 할 때 : module_init()
Unloading 할 때 : module_exit()
2. 리눅스 모듈의 종류
리눅스의 모듈에는 다양한 종류가 존재하는데, 대표적인 모듈 4가지에 대해 설명하겠습니다.
2.1 디바이스 드라이버 모듈 (Device Driver Modules)
디바이스 드라이버 모듈은 특정 하드웨어 장치를 제어하고 관리하기 위한 드라이버를 포함합니다.
이러한 모듈은 하드웨어와 커널 간의 인터페이스 역할을 담당합니다.
- 예시
- e1000.ko : Intel Ethernet 네트워크 카드 드라이버
- snd_hda_intel.ko : Intel HD 오디오 드라이버
- nvidia.ko : NVIDIA 그래픽 카드 드라이버
2.2 파일 시스템 모듈 (File System Modules)
파일 시스템 모듈은 다양한 파일 시스템을 지원하기 위한 기능을 제공합니다.
이를 통해 커널이 특정 파일 시스템을 마운트하고 관리할 수 있습니다.
커널 소스 디렉토리가 '/usr/src/linux' 라고 할 때, 아래의 예시 관련 모듈들은 /lib/modules/$(uname -r)/kernel/drivers 경로에 위치하고, 각 모듈에 대한 C파일은 '/usr/src/linux' (커널 소스 디렉토리)의 하위 경로에서 확인할 수 있습니다.
- 예시
- ext4.ko : EXT4 파일 시스템 지원
- xfs.ko : XFS 파일 시스템 지원
- ntfs.ko : NTFS 파일 시스템 지원
2.3 네트워크 프로토콜 모듈 (Network Protocol Modules)
네트워크 프로토콜 모듈은 다양한 네트워크 프로토콜을 지원하여 네트워크 통신을 가능하게 합니다.
- 예시
- ipv6.ko : IPv6 프로토콜 지원
- tcp.ko : TCP 프로토콜 지원
- wireguard.ko : WireGuard VPN 프로토콜 지원
2.4 보안 모듈 (Security Modules)
보안 모듈은 시스템의 보안 정책을 구현하고 강화하기 위해 사용됩니다.
대표적으로 리눅스 보안 모듈(Linux Security Modules) 프레임워크를 통해 동작합니다.
- 예시
- selinux.ko : SELinux 보안 모듈
- apparmor.ko : AppArmor 보안 모듈
3. 리눅스 모듈 적용 방법
3.1 관련 함수 설명
- lsmod
- 리눅스 커널에 적재된 모듈 정보를 출력하는 명령입니다.
- 모듈명과 크기, 다른 모듈에서 사용 중인 횟수와 해당 모듈의 이름을 나타냅니다.
- insmod [모듈명]
- 다른 모듈을 커널에 적재시키기 위해서 사용하는 명령입니다.
- 사용하고자 하는 모듈이 존재하는 디렉토리까지 이동 후, insmod 명령을 사용해 커널에 적재할 수 있지만, 특정 파일이나 모듈에 의존성이 있는 모듈은 적재할 수 없습니다.
- rmmod [모듈명]
- 사용한 모듈을 커널에서 제거하고자 할 때 사용하는 명령입니다.
- modinfo [모듈명]
- 특정 모듈에 대한 라이센스나 버전 등 다양한 정보를 확인할 수 있습니다.
- modprob [옵션] [모듈명]
- 모듈의 최상위 디렉토리에 있는 modules.dep 파일을 참고해서 단일 모듈, 의존성이 있는 모듈 모두 커널에서 자유롭게 적재, 제거할 수 있는 명령
- 옵션
- -l : 사용 가능한 모듈 정보 출력
- -r : 모듈 제거 시, 의존성있는 모듈 확인, 없다면 제거
- -c : 모듈의 환경설정 파일의 내용을 출력
3.2 간단한 코드 예제 및 적용 과정 설명
1. 'hello.c' 파일 작성
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
MODULE_LICENSE("GPL"); // 저작권 정보
MODULE_AUTHOR("DAYNE"); // 모듈 제작자 정보
MODULE_DESCRIPTION("Module Programming - hello module"); // 모듈 관련 정보
static int __init module_begin(void) {
printk("Hello, linux kernel module. \n");
return 0;
}
static void __exit module_end(void) {
printk("Good Bye\n");
}
module_init(module_begin);
module_exit(module_end);
- 필요한 include 파일들 포함시키기
- module license 지정
- 종류 : GPL, GPL v2, Dual BSD/GPL 등
- 커널 2.6부터 반드시 지정해야 함
- printk() : 커널 메시지를 출력하는 함수
- module_init 함수 작성 및 등록 : module_init(init_func);
- module_exit 함수 작성 및 등록 : module_exit(exit_func);
2. 커널 모듈 프로그램을 위한 Makefile 작성
obj-m += hello.o
all :
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
- /home/sdh/my/hello 내에 hello.c 파일 위치시키기 (my와 hello 디렉토리는 임의로 생성한 디렉토리)
- hello.c 파일이 존재하는 경로에다가 Makefile 이라는 이름으로 위의 코드를 붙여 파일 생성 후, 'make' 명령어 실행
- make를 진행하는 폴더에 Makefile 이름의 파일이 있다면, 별도의 설정 없이 Makefile 안의 내용을 가져와서 진행합니다.
- 만약 경로가 다르거나 파일명이 다른 경우, -f 옵션으로 진행해야 합니다. 'make -f ./test/CMakefile
- 출처 : https://m.blog.naver.com/idec1995/222327553683
- 컴파일 과정
- hello.o 파일 먼저 작성
- modpost를 C 소스파일에 적용해 .ko에서 요구되는 추가 정보를 부착하여 hello.mod.c를 생성한 후 컴파일 → hello.mod.o 생성
- 2개의 .o 파일을 링크하여 .ko(kernel object) 파일을 생성
3. 모듈 적재(loading) & 제거 (unloading)
- 생성된 모듈(hello.ko)을 로딩
- 'insmod hello.ko' 명령 실행
- 커널에 적재된 모듈 목록 보기
- 'lsmod' 명령 실행
- 모듈 제거
- 'rmmod hello' 명령 실행
- hello 뒤에 .ko가 붙지 않음을 주위
- hello 모듈 동작 확인
- 'dmesg' 또는 'tail -f /var/log/kern.log' 실행
- dmesg : 시스템 부팅 메시지를 확인하는 명령어
- tail : 파일의 마지막 부분을 출력하는 명령어로, 실시간으로 업데이트 되는 로그를 볼 때 주로 사용
- 모듈 적재와 제거 시에, 설정한 메시지들이 정상적으로 출력되는지 확인
- -f 옵션 : 계속적인 변화 출력
- 'dmesg' 또는 'tail -f /var/log/kern.log' 실행
insmod hello.ko로 생성된 모듈을 커널로 로딩한 후, sudo dmesg 명령어를 입력하면 'Hello, linux kernel module' 문장이 보입니다.
이후 rmmod hello로 커널에서 모듈을 제거한 후, 다시 sudo dmesg 명령어를 입력하면 Good Bye 문장이 보입니다.
참고
[리눅스] 모듈의 관리와 설정파일
리눅스에서 모듈은 리눅스에서 모듈은 대부분 커널모듈을 이야기한다. 때문에, 모듈을 이해하기 위해서는 커널에 대해서 먼저 알고있는게 수월하다. 커널이란 커널은 모든 리눅스 운영체제의
wiseworld.tistory.com
[ Linux Kernel ] 21. 모듈 프로그래밍
21. 모듈 프로그래밍 커널 모듈(Kernel Module) 시스템 부팅후에 동적으로 loading할 수 있는 커널 구성요소를 말한다. 커널을 다시 컴파일하거나 시스템 재부팅 할 필요없이 커널의 일부분을 교체하는
coder-in-war.tistory.com
[ Linux Kernel ] 21. 모듈 프로그래밍
21. 모듈 프로그래밍 커널 모듈(Kernel Module) 시스템 부팅후에 동적으로 loading할 수 있는 커널 구성요소를 말한다. 커널을 다시 컴파일하거나 시스템 재부팅 할 필요없이 커널의 일부분을 교체하는
coder-in-war.tistory.com
'시스템 프로그래밍 > 리눅스' 카테고리의 다른 글
리눅스 라이브러리 종류 및 설명 (0) | 2024.10.18 |
---|---|
리눅스 디바이스 드라이버의 종류 및 확인 (0) | 2024.10.15 |
리눅스 커널 컴파일 방법 (0) | 2024.10.11 |
리눅스 I/O 스케줄러 종류 및 동작 과정 (0) | 2024.10.10 |
리눅스 프로세스 스케줄링, 프로세스 스케줄러의 종류 및 동작 방식 (0) | 2024.10.10 |