Presentation is loading. Please wait.

Presentation is loading. Please wait.

Module Programming Linux Kernel 수업 4번째.

Similar presentations


Presentation on theme: "Module Programming Linux Kernel 수업 4번째."— Presentation transcript:

1 Module Programming Linux Kernel 수업 4번째

2 목 차 모듈 개발 절차 모듈 프로그램 실습 System Call Wrapping 간단한 모듈 실습
모듈 내 함수 export/import 모듈에 파라메터 전달하기 System Call Wrapping OS2 강의교재

3 모 듈 모듈 : 커널의 기능을 동적으로 확장하고 올리거나 내릴 수 있는 단위 모듈 개발 절차 메인 메모리 source t1.c
Object t1.o load unload Kernel영역 Compile gcc –c –D__KERNEL__-DMODULE –I/usr/src/linux/include -Wall t1.c OS2 강의교재

4 모듈 개발 절차 1. 모듈 프로그램 작성 2. 소스 컴파일 (모듈 생성)
 gcc –c –D_ _KERNEL_ _ –DMODULE –I/usr/src/linux/include –Wall filename.c 3. 적재 모듈 확인 (메모리에 적재된 모듈을 리스트 형태로 보여줌.)  lsmod 4. 모듈 적재 (생성한 모듈을 메모리에 적재)  insmod filename.o 5. 모듈 제거 (모듈을 메모리에서 제거)  rmmod filename OS2 강의교재

5 모듈 framework 모듈 개발 시 필요한 함수 main은 존재하지 않음 init_module: cleanup_module
모듈이 수행될 때의 시작 함수 (클래스의 생성자와 유사) cleanup_module 모듈이 제거될 때 반드시 수행되는 종료 함수 (클래스의 소멸자와 유사) #include <linux/kernel.h> #include <linux/module.h> // 헤더파일 선언 // 모듈이 올라갈 때 초기화되는 부분으로 반드시 필요. int init_module() { ..... // 각종 초기화 작업 } // 모듈이 제거될 때 사용되는 부분으로 반드시 필요. void cleanup_module() ..... // 사용한 자원 제거 등의 프로그램 마무리 작업 ...... OS2 강의교재

6 모듈 실습 간단한 모듈 작성 < t1.c > OS2 강의교재

7 모듈 실습 컴파일 및 적재된 모듈 확인 (insmod) OS2 강의교재

8 모듈 실습 모듈 적재 및 제거 insmod t1.o  모듈의 적재 (모듈이 적재됨을 알림) (적재된 모듈 리스트를 출력)
(적재한 모듈이 출력됨) (모듈이 메모리에서 해제됨을 알림) OS2 강의교재

9 모듈 프로그램 시 주의사항 커널의 버전과 모듈의 버전 일치 버전이 다른 경우 커널 버전 확인 : uname –r
모듈 버전 확인 : /usr/include/linux  vi version.h 버전이 다른 경우 1. gcc 컴파일 시 참조하는 헤더파일 디렉터리 삭제 2. 커널의 헤더파일 디렉터리로 심볼링크로 생성 헤더 파일 디렉터리 삭제 rm –rf /usr/include/linux rm –rf /usr/include/asm 커널 version의 헤더 파일로 링크 ln –s /usr/src/linux/include/linux /usr/include/linux ln –s /usr/src/linux/include/asm /usr/include/asm OS2 강의교재

10 모듈에서 사용 가능한 함수 모듈에서 사용 가능한 함수, 변수 등이 export되어 있음 cat /proc/ksyms
printk(); 함수도 export되어 있기 때문에 사용가능 그 외 함수나 변수를 사용하려면.. 아래 파일을 수정하여 export시킴 (물론 커널 컴파일을 다시 하여야 함) /usr/src/linux/kernel/ksyms.c OS2 강의교재

11 모듈간의 함수 export/import t1.c 파일에 함수 추가 컴파일
gcc –c –D_ _KERNEL_ _ –DMODULE –Wall t1.c OS2 강의교재 < t1.c >

12 모듈간의 함수 export/import t2.c 모듈 작성 모듈 컴파일
gcc –c –D_ _KERNEL_ _ –DMODULE –Wall t2.c < t2.c > OS2 강의교재

13 모듈간의 함수 export/import t1 모듈 적재 후 t2모듈을 적재하여 확인 OS2 강의교재

14 모듈에 파라메터 전달하기 Int 형 파라메터 한 개 전달
MODULE_PARM( name, type )  i :정수, s :문자 < t2.c > OS2 강의교재

15 모듈에 파라메터 전달하기 모듈 컴파일 후 적재 OS2 강의교재

16 모듈에 파라메터 전달하기 int형 파라메터 2개 전달 < t2.c > OS2 강의교재

17 모듈에 파라메터 전달하기 컴파일 후 모듈 적재 OS2 강의교재

18 모듈에 파라메터 전달하기 문자열 파라메타 전달 < t2.c > OS2 강의교재

19 모듈에 파라메터 전달하기 모듈 컴파일 후 적재 OS2 강의교재

20 System Call Wrapping System call wrapping
윈도우에서의 hooking 과 유사 sys_fork(); /* kernel/fork.c */ sys_call_table sys_exit(); sys_read(); sys_write(); ... 1 2 3 4 .. sys_my_fork(); /* my_fork.c */ OS2 강의교재

21 System Call Wrapping Open 함수를 wrapping 하는 예제
system call table의 포인터를 가져오기 위한 선언 (기존의 Open 을 가져오기 위한 prototype) (새로운 Open 함수) OS2 강의교재

22 System Call Wrapping Init module Cleanup module
System call table 에서 open 함수를 다른 함수로 대체함 Cleanup module Module을 삭제 시 원래의 기능으로 복원하기 위해 open 함수를 되돌려 놓음 OS2 강의교재

23 System Call Wrapping 모듈 컴파일 후 insert module 후 화면 (lsmod를 위한 open된 파일)
OS2 강의교재

24 참고 – C언어 Storage Class와 Scope
전역 변수/외부 변수 범위: 전역 수명: 프로그램이 수행되는 동안 유지 전역 변수는 자동으로 0으로 초기화된다 main() 이전에 선언해야 한다 전역변수에 static을 사용하면 해당 소스 파일 내 존재하는 함수들간에만 공유된다 지역변수 범위: 함수 안에서만 유효 수명: 함수가 종료되면 메모리 해제 함수 안에서 선언되는 변수 함수 내에서 static을 사용하면 함수가 종료된 이후에도 변수를 유지하며, 다음 호출시에 재사용된다 OS2 강의교재

25 참고 – gcc 최적화 옵션 커널 컴파일 시 최적화 옵션 –O2만 사용하는 이유(-O0~3)
최적화옵션 의미 -O0(기본값) 최적화를 수행하지 않는다 -O -O1 코드 크기와 실행 시간을 줄이는 것을 제외한 최적화는 실행하지 않는다 -O2 메모리 공간과 속도를 희생하지 않는 범위내의 모든 최적화를 수행한다 loop unrolling과 function inlining에 대한 최적화를 수행하지 않는다 -O3 O2 최적화에 인라인 함수와 레지스터에 대한 최적화를 추가로 수행한다 -Os -O2 최적화와 함께 코드 크기에 대한 최적화를 수행한다 OS2 강의교재

26 참고 – Loop Unrolling 루프안에서 실행되는 CPU 명령어 수를 줄임으로서 CPU 캐시 히트율을 높이고, 분기를 줄임으로서 수행속도를 개선하는 방법 루프안에서 수행되는 루프를 하나의 반복구문으로 결합하는 방법 단점: 하나의 반복문 수행에 필요한 레지스터 수가 증가 -> 코드 크기 증가 -> 임베디드 시스템에는 바람직하지 않음 OS2 강의교재


Download ppt "Module Programming Linux Kernel 수업 4번째."

Similar presentations


Ads by Google