Upload
emma-hinton
View
69
Download
3
Embed Size (px)
DESCRIPTION
Module programming. 모듈 프로그래밍. 모듈프로그래밍. 초기 리눅스 : 커널 변경시 커널 전체를 다시 컴파일 모듈 프로그램으로 개발하면 해당 모듈만 컴파일하고 필요할 때만 동적으로 링크시켜 커널의 일부로 사용할 수 있어 효율적 자주 사용하지 않는 커널 기능은 메모리에 상주시키지 않아도 됨 확장성과 재사용성을 높일 수 있음. 모듈 프로그래밍의 특징 사건 구동형 (event-driven program) 방식으로 작성 내부에 main() 이 없음 - PowerPoint PPT Presentation
Citation preview
- 2 -
초기 리눅스 : 커널 변경시 커널 전체를 다시 컴파일 모듈 프로그램으로 개발하면 해당 모듈만 컴파일하고 필요할 때만
동적으로 링크시켜 커널의 일부로 사용할 수 있어 효율적 자주 사용하지 않는 커널 기능은 메모리에 상주시키지 않아도 됨 확장성과 재사용성을 높일 수 있음 .
모듈프로그래밍
- 3 -
모듈 프로그래밍의 특징 사건 구동형 (event-driven program) 방식으로 작성 내부에 main() 이 없음 커널에 적재 / 제거하기 위한 규칙과 유틸리티가 필요 외부로 공개할 전역변수 사용에 주의 커널에 적재된 모듈 프로그램은 무제한의 특권을 가지므로 신중하게 작성해야 함
- 4 -
심볼 및 관련 매크로 전역변수와 전역 함수 이름을 심볼 테이블에 등록 커널 심볼 테이블의 내용은 /proc/kallsyms 라는 텍스트 파일로 외부에 제공 EXPORT_NO_SYMBOLS: 공개하지 않음 EXPORT_SYMBOL(), EXPORT_SYMBOL_GPL(): 공개
- 5 -
모듈 프로그램의 기본 형태
01 #include <linux/kernel.h> // 커널에서 수행될 때 필요한 헤더 02 #inculde <linux/module.h> // 모듈에서 필요한 헤더 03 #include <linux/init.h> //module_init(), module_exit() 매크로 정의를 위한 헤더 04 MODULE_LICENSE(“GPL”); // 라이선스 표시 05 06 int module_start() { // 모듈이 설치될 때 초기화를 수행하는 코드 07 …08 return 0; // 초기화에 성공하였음을 알리기 위해 0 을 반환 09 }10 11 void module_end() { // 모듈이 제거될 때 반환 작업을 수행하는 코드12 … 13 }14 15 module_init(module_start); // 모듈 적재 함수를 위한 매크로 16 module_exit(module_end); // 모듈 제거 함수를 위한 매크로
- 6 -
호스트 시스템에서 모듈 생성을 위한 Makefile 기본 형태
타겟 시스템에서 모듈 생성을 위한 Makefile 기본 형태
01 obj-m := test.o02 KDIR := /lib/modules/$(shell uname -r)/build03 PWD := $(shell pwd)0405 default:06 $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules0708 clean:09 rm -rf *.ko *.mod.* .*.cmd *.o
01 KDIR := … # 타겟임베디드소스가 있는디렉토리0203 obj-m:= test.o0405 build: 06 make -C $(KDIR) SUBDIRS=$(PWD) modules0708 clean:09 rm -rf *.ko *.mod.* .*.cmd *.o
- 7 -
head /proc/kallsyms, tail /proc/kallsyms 를 입력해 커널 심볼 테이블의 내용을 확인
실습 [ 모듈기초 ]-1 호스트 시스템의 커널 공개 심볼 살펴보기
- 9 -
모듈 프로그램 hello.c 작성
실습 [ 모듈기초 ]-2 Hello 모듈 프로그램 작성 및 실행
01 #include <linux/kernel.h>02 #include<linux/module.h>03 #include<linux/init.h>0405 static int module_begin(void) // 모듈 초기화 함수06 {07 printk("Hello, Module!\n");08 return 0;09 }1011 static void module_end(void) // 모듈 마무리 함수12 {13 printk("Good bye!\n");14 }1516 module_init(module_begin);17 module_exit(module_end);
- 10 -
② Makefile 을 작성 앞의 호스트시스템용 makefile 에서 test.o→hello.o
③ make 로 hello.ko 모듈 프로그램을 생성하고 테스트
실습 [ 모듈기초 ]-3 Hello 모듈 프로그램 작성 및 실행
①
②③
④
⑤
- 11 -
④ cat /proc/kallsyms 명령으로 커널 심볼 테이블에 있는 hello.c 의 심볼들을 확인
실습 [ 모듈기초 ]-4 Hello 모듈 프로그램 작성 및 실행