120 likes | 404 Views
Module programming. 모듈 프로그래밍. 모듈프로그래밍. 초기 리눅스 : 커널 변경시 커널 전체를 다시 컴파일 모듈 프로그램으로 개발하면 해당 모듈만 컴파일하고 필요할 때만 동적으로 링크시켜 커널의 일부로 사용할 수 있어 효율적 자주 사용하지 않는 커널 기능은 메모리에 상주시키지 않아도 됨 확장성과 재사용성을 높일 수 있음. 모듈 프로그래밍의 특징 사건 구동형 (event-driven program) 방식으로 작성 내부에 main() 이 없음
E N D
Module programming 모듈 프로그래밍
모듈프로그래밍 • 초기 리눅스: 커널 변경시 커널 전체를 다시 컴파일 • 모듈 프로그램으로 개발하면 해당 모듈만 컴파일하고 필요할 때만 동적으로 링크시켜 커널의 일부로 사용할 수 있어 효율적 • 자주 사용하지 않는 커널 기능은 메모리에 상주시키지 않아도 됨 • 확장성과 재사용성을 높일 수 있음.
모듈 프로그래밍의 특징 • 사건 구동형(event-driven program) 방식으로 작성 • 내부에 main()이 없음 • 커널에 적재/제거하기 위한 규칙과 유틸리티가 필요 • 외부로 공개할 전역변수 사용에 주의 • 커널에 적재된 모듈 프로그램은 무제한의 특권을 가지므로 신중하게 작성해야 함
심볼 및 관련 매크로 • 전역변수와 전역 함수 이름을 심볼 테이블에 등록 • 커널 심볼 테이블의 내용은 /proc/kallsyms라는 텍스트 파일로 외부에 제공 • EXPORT_NO_SYMBOLS: 공개하지 않음 • EXPORT_SYMBOL(), EXPORT_SYMBOL_GPL(): 공개
호스트 시스템에서 모듈 생성을 위한 Makefile 기본 형태 • 타겟 시스템에서 모듈 생성을 위한 Makefile 기본 형태
실습 [모듈기초]-1호스트 시스템의 커널 공개 심볼 살펴보기 • head /proc/kallsyms, tail /proc/kallsyms를 입력해 커널 심볼 테이블의 내용을 확인
insmod: 모듈을 커널로 적재하는 명령 • rmmod: 제거하는 명령 • lsmod: 정상적으로 적재되었는지 확인하는 명령
실습[모듈기초]-2Hello 모듈 프로그램 작성 및 실행 • 모듈 프로그램 hello.c 작성 01 #include <linux/kernel.h> 02 #include<linux/module.h> 03 #include<linux/init.h> 04 05 static int module_begin(void) // 모듈 초기화 함수 06 { 07 printk("Hello, Module!\n"); 08 return 0; 09 } 10 11 static void module_end(void) // 모듈 마무리 함수 12 { 13 printk("Good bye!\n"); 14 } 15 16 module_init(module_begin); 17 module_exit(module_end);
① ② ③ ④ ⑤ 실습 [모듈기초]-3Hello 모듈 프로그램 작성 및 실행 • Makefile을 작성 앞의 호스트시스템용 makefile에서 test.o→hello.o • make로 hello.ko 모듈 프로그램을 생성하고 테스트
실습 [모듈기초]-4Hello 모듈 프로그램 작성 및 실행 • cat /proc/kallsyms 명령으로 커널 심볼 테이블에 있는 hello.c의 심볼들을 확인
실습 [모듈기초]-5타겟시스템용 모듈 작성 • 기본적으로 호스트 시스템용 모듈과 유사 • 다음을 수정 • 타겟시스템용Makefile에서 KDIR 수정 • KDIR := /achro4210/kernel # if 보드용커널의 위치가 /achro4210/kernel • Minicom 을이용하여 보드로 hello.ko이동 • 보드에서 다음을 수행 • insmodhello.ko • lsmod | grep hello • dmesg | tail –n 5 • rmmod hello