12
- 1 - 모모 모모모모모 Module programming

모듈 프로그래밍

Embed Size (px)

DESCRIPTION

Module programming. 모듈 프로그래밍. 모듈프로그래밍. 초기 리눅스 : 커널 변경시 커널 전체를 다시 컴파일 모듈 프로그램으로 개발하면 해당 모듈만 컴파일하고 필요할 때만 동적으로 링크시켜 커널의 일부로 사용할 수 있어 효율적 자주 사용하지 않는 커널 기능은 메모리에 상주시키지 않아도 됨 확장성과 재사용성을 높일 수 있음. 모듈 프로그래밍의 특징 사건 구동형 (event-driven program) 방식으로 작성 내부에 main() 이 없음 - PowerPoint PPT Presentation

Citation preview

- 1 -

모듈 프로그래밍Module programming

- 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 호스트 시스템의 커널 공개 심볼 살펴보기

- 8 -

insmod: 모듈을 커널로 적재하는 명령

rmmod: 제거하는 명령

lsmod: 정상적으로 적재되었는지 확인하는 명령

- 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 모듈 프로그램 작성 및 실행

- 12 -

기본적으로 호스트 시스템용 모듈과 유사 다음을 수정

타겟시스템용 Makefile 에서 KDIR 수정 KDIR := /achro4210/kernel # if 보드용 커널의 위치가 /achro4210/kernel

Minicom 을 이용하여 보드로 hello.ko 이동 보드에서 다음을 수행

insmod hello.ko lsmod | grep hello dmesg | tail –n 5 rmmod hello

실습 [ 모듈기초 ]-5 타겟시스템용 모듈 작성