본문 바로가기
C++ 200제/코딩 IT 정보

리눅스 디바이스 드라이버 모듈 프로그래밍과 커널, 명령어 설명

by vicddory 2017. 1. 31.

리눅스 디바이스 드라이버 모듈 프로그래밍과 커널, 명령어 설명


모듈(module) 소개


리눅스의 특징 중 하나는 리눅스 커널이 동작 중에 기능을 추가

- 수행 중에 커널에 부가되는 디바이스 드라이버 코드의 부분을 모듈

  : 실행 중인 리눅스 커널에 동적으로 적재되거나 제거

- 하나의 오브젝트 파일(*.o)

- 이벤트 처리(Event handling) 형태의 프로그램 방식

  : main() 함수가 없다

  : startup, cleanup 함수 존재


- 주로 파일 시스템과 디바이스 드라이버 구현 시 모듈 프로그래밍

- 각 모듈은 동적으로 링크될 수 있는 목적코드로 insmod 로 커널에 링크되고 rmmod로 링크가 해제


kisspng-kernel-real-time-operating-system-operating-system-ubc-sauder-school-of-business-5b3daaef2ed229.4610120315307681111918


모듈 프로그램의 이점

- 효과적인 메모리 사용

- 커널 전체를 다시 컴파일하지 않고 커널의 일부분 또는 디바이스 드라이버를 교체할 수 있음


모듈 프로그램의 단점

- 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

 목적 파일을 검사해서 관련된 정보를 표시



리눅스 디바이스 드라이버 모듈 프로그래밍과 커널, 명령어 설명

댓글