강의 PPT - 수원과학대학교 정보통신과

Download Report

Transcript 강의 PPT - 수원과학대학교 정보통신과

12주차. 모듈 프로그래밍
수원과학대학교 정보통신과
12.1 모듈 프로그래밍의 개요




초기 리눅스에서는 커널 변경시 커널 전체를 다시
컴파일해야 했음
모듈 프로그램으로 개발하면 해당 모듈만 컴파일
하고 필요할 때만 동적으로 링크시켜 커널의 일부
로 사용할 수 있어 효율적
자주 사용하지 않는 커널 기능은 메모리에 상주시
키지 않아도 됨
확장성과 재사용성을 높일 수 있음
수원과학대학 정보통신과
2
모듈 프로그래밍의 특징





사건 구동형(event-driven program) 방식으로 작
성
내부에 main()이 없음
커널에 적재/제거하기 위한 규칙과 유틸리티가 필
요
외부로 공개할 전역변수 사용에 주의
커널에 적재된 모듈 프로그램은 무제한의 특권을
가지므로 신중하게 작성해야 함
수원과학대학 정보통신과
3
12.2 모듈 프로그래밍의 규칙

심볼 및 관련 매크로
전역변수와 전역 함수 이름을 심볼 테이블에 등록
 커널 심볼 테이블의 내용은 /proc/kallsyms라는 텍스트 파일로 외부에 제
공
 EXPORT_NO_SYMBOLS: 공개하지 않음
 EXPORT_SYMBOL(), EXPORT_SYMBOL_GPL(): 공개


라이선스 종류
수원과학대학 정보통신과
4
호스트 시스템의 커널 공개 심볼 살펴보기
①
head /proc/kallsyms, tail /proc/kallsyms를 입력해 커널
심볼 테이블의 내용을 확인
수원과학대학 정보통신과
5
모듈 프로그램의 기본 형태
01
02
03
#include <linux/kernel.h>
#inculde <linux/module.h>
#include <linux/init.h>
04
05
06
07
08
09
10
11
12
13
14
15
16
MODULE_LICENSE(“GPL”);
//커널에서 수행될 때 필요한 헤더
//모듈에서 필요한 헤더
//module_init(), module_exit()
매크로 정의를 위한 헤더
//라이선스 표시
int module_start() {
…
return 0;
}
//모듈이 설치될 때 초기화를 수행하는 코드
void module_end() {
…
}
//모듈이 제거될 때 반환 작업을 수행하는 코드
//초기화에 성공하였음을 알리기 위해 0을 반환
module_init(module_start);
module_exit(module_end);
//모듈 적재 함수를 위한 매크로
//모듈 제거 함수를 위한 매크로
수원과학대학 정보통신과
6

호스트 시스템 용 모듈 생성을 위한 Makefile 기본 형태 (코드 12-2)
01
02
03
04
05
06
07
08
09

obj-m
KDIR
PWD
:= test.o
:= /lib/modules/$(shell uname -r)/build
:= $(shell pwd)
default:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
clean:
rm -rf *.ko
*.mod.* .*.cmd *.o
타겟 시스템 용 모듈 생성을 위한 Makefile 기본 형태 (코드 12-3)
01
02
03
04
05
06
07
08
09
KDIR
:= /embed/kernel/linux
obj-m
:= test.o
build:
make -C $(KDIR) SUBDIRS=$(PWD) modules
clean:
rm -rf *.o *.ko *.mod.* .*.cmd
수원과학대학 정보통신과
7
12.3 모듈 유틸리티

insmod: 모듈을 커널로 적재하는 명령

rmmod: 제거하는 명령

lsmod: 정상적으로 적재되었는지 확인하는 명령

모듈 사이의 의존성을 파악해 자동으로 적재하는 기능



적용할 모듈을 /lib/modules/<커널 버전> 디렉토리에 복사
depmod –a 명령 실행
modprobe <모듈 이름> 명령 실행
수원과학대학 정보통신과
8
실습 12-1 Hello 모듈 프로그램 작성 및 실행
①
mkdir -p /embed/ex/12/hello
②
cd /embed/ex/12/hello
수원과학대학 정보통신과
9
실습 12-1 Hello 모듈 프로그램 작성 및 실행
모듈 프로그램 hello.c 작성(12/hello/hello.c)
③
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
#include <linux/kernel.h>
#include<linux/module.h>
#include<linux/init.h>
static int module_begin(void) // 모듈 초기화 함수
{
printk("Hello, Module!\n");
return 0;
}
static void module_end(void) // 모듈 마무리 함수
{
printk("Good bye!\n");
}
module_init(module_begin);
module_exit(module_end);
수원과학대학 정보통신과
10
실습 9-1 Hello 모듈 프로그램 작성 및 실행
④
Makefile을 작성

⑤
ppt slide #7의 호스트용 Makefile을 작성하되 test.o→hello.o
make로 hello.ko 모듈 프로그램을 생성하고 테스트
수원과학대학 정보통신과
11
실습문제

[실습 12-1]의 hello.c를 타깃 시스템용으로 컴파
일해 모듈을 생성한 후, 타깃 시스템에 적재하고
제거하면서 출력메시지를 확인하시오.
수원과학대학 정보통신과
12