Download presentation
Presentation is loading. Please wait.
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 강의교재
Similar presentations