티스토리 뷰
목차
리눅스 디바이스 드라이버 모듈 프로그래밍과 커널, 명령어 설명
모듈(module) 소개
리눅스의 특징 중 하나는 리눅스 커널이 동작 중에 기능을 추가
- 수행 중에 커널에 부가되는 디바이스 드라이버 코드의 부분을 모듈
: 실행 중인 리눅스 커널에 동적으로 적재되거나 제거
- 하나의 오브젝트 파일(*.o)
- 이벤트 처리(Event handling) 형태의 프로그램 방식
: main() 함수가 없다
: startup, cleanup 함수 존재
- 주로 파일 시스템과 디바이스 드라이버 구현 시 모듈 프로그래밍
- 각 모듈은 동적으로 링크될 수 있는 목적코드로 insmod 로 커널에 링크되고 rmmod로 링크가 해제
모듈 프로그램의 이점
- 효과적인 메모리 사용
- 커널 전체를 다시 컴파일하지 않고 커널의 일부분 또는 디바이스 드라이버를 교체할 수 있음
모듈 프로그램의 단점
- namespace pollution
- 리눅스 커널에 삽입되어 확장된 커널이 됨
- 기존 커널의 광역변수 혹은 함수명이 충돌 가능성
모듈 프로그래밍의 예 – hello.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | /* Module example –hello.c */ #include <linux/kernel.h> /* 커널에서 수행될 때 필요한 헤더 파일 */ #include <linux/module.h> /* 모듈에 필요한 헤더 파일 */ #include <linux/init.h> /* module_init(), module_exit() 매크로 정의 */ int module_begin(void) /* 모듈이 설치될 때 초기화 수행, insmod 할 때 수행되는 함수 */ { printk(“<1> Hello, world₩n”); return 0; } void module_end(void) /* 모듈이 제거될 때 반환 작업 수행, rmmod 할 때 수행되는 함수*/ { printk(“<1> Goodbye, world ₩n”); } module_init(module_begin); module_exit(moduel_end); | cs |
코드 설명
모듈 등록 및 해제
- 등록 시 module_begin() 실행
- 해제 시 modue_end() 실행
예제 코드
- insmod로 모듈을 로드하고 커널에 링크된 후 printk()를 호출
- rmmod로 모듈을 제거할 때도 printk()를 호출
printk() 함수
- 리눅스 커널은 C 라이브러리 없이 자체 고유의 함수 지원 (디바이스 드라이버 구현의 특징)
- 따라서 printf()는 지원되지 않고 비슷한 기능의 printk() 함수 지원
- <1>은 메시지의 우선순위를 나타내며 번호가 낮을수록 우선순위가 높음
- 콘솔에서 실행된 경우 화면에 출력되고 xterm 등에서는 /var/log/messages 등과 같은 시스템 로그 파일에 출력
커널의 종류
Monolithic Kernel
- 커널의 모든 기능이 하나의 실행 파일로 구성됨
- 유연하지 못함
- Linux, 대부분의 사용 UNIX
Micro Kernel
- 커널은 극히 제한적인 작업만을 수행
: 서버와 프로세스 간의 통신, H/W 제어
- 파일시스템 디바이스 드라이버 등의 기능은 서버로 구현
- 유연하지만, 통신 오버헤드가 심함
- Windows
[리눅스 프로그래밍]
[리눅스 커널] 모듈 프로그래밍의 예 – Makefile
1 2 3 4 5 6 7 8 9 10 11 | # Makefile for a basic kernel module CC := gcc # arm-linux-gcc, 크로스 컴파일러 # Modify this statement to your kernel directory INCLUDEDIR := /usr/src/linux-2.4.20-8/include/ MODCFLAGS := -Wall -O2 -DMODULE -D__KERNEL__ -DLINUX -I$(INCLUDEDIR) hello.o : hello.c $(CC) $(MODCFLAGS) -c hello.c | cs |
# make <- 모듈 컴파일
# /sbin/insmod hello.o <- 모듈을 커널에 적재
# /sbin/lsmod <- 적재된 모듈 보기
# /sbin/rmmod hello <- 모듈 삭제하기
# tail /var/log/messages <- 로그 파일 출력
모듈 프로그래밍의 실행 예
[리눅스 프로그래밍]
모듈 관련 리눅스 명령어
명령어 |
용도 |
insmod |
모듈을 커널에 적재하여 실행 |
rmmod |
실행 중인 모듈을 커널에서 제거 |
lsmod |
현재 커널에 적재된 모듈들 정보를 표시 |
depmod |
커널 내부에 적재된 모듈 간의 의존성을 검사 |
modprobe |
insmod와 유사하나, 모듈 간 의존성을 검사하여 그 결과 빠진 다른 모듈을 찾아서 적재한다는 점에서 차이 |
modinfo |
목적 파일을 검사해서 관련된 정보를 표시 |
리눅스 디바이스 드라이버 모듈 프로그래밍과 커널, 명령어 설명