강의 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