커널모듈 구조를 이용함으로서 디바이스 드라이버를 추가/삭제하는 작업이 쉬워졌다.
그러나 커널 모듈프로그램은 커널 레벨의 권한을 가지고 수행되므로 일반 응용프로그램 같은 운영체제의 보호를 받지 못한다.


(1) 커널 모듈과 관련한 유틸리티(명령어)
- insmod{module, ...} : 커널 모듈을 추가
- rmmod{module, ...} :  커널 모듈을 제거
- lsmod{module, ...} :  현재 적재된 모듈의 이름을 출력
- modproble{module, ...} :  모듈간의 의존성을 검사해서 필요한 커널 모듈을 적재한다.
- depmod :  모듈간의 의존성을 검사


(2) 커널 모듈 프로그래밍 시 필요한 매크로

- 응용프로그램에서 커널모듈(디바이스 드라이버)을 사용하고 있는데, 일방적으로 커널 모듈이 시스템에서 제거된다면, 
  응용프로그램은
비정상적인 종료를 하고, 이는 파일시스템의 손상으로 이어질 수 있다.
  ○ 사용하고 있는 프로그램의 갯수를 관리 할 필요가 있다.
     - MOD_INC_USE_COUNT    :  카운트 1증가 --> 커널 모듈 사용시 : open() 시스템 호출
     - MOD_DEC_USE_COUNT   :  카운트 1감소 --> 커널 모듈 사용 마칠때
     - MOD_IN_USE                  :  현재 카운트가 0인지 아닌지 확인

- 커널모듈은 내부코드에 여러 심볼(함수명이나 변수명)들을 가지고 있는데, 이 심볼들은 커널모듈적재 시 자동으로 커널 심볼
   테이블에
등록된다.
  ○ 이때 내부에서만 사용할 것을 굳이 커널 심볼테이블에 등록해서 다른 커널모듈에서 사용가능하게 할 필요가 없다.
      그러면 오히려 심볼 관리가 힘들어 진다. 이를 매크로로 조절할 필요가 있다.
     - EXPORT_NO_SYMBOLS                  :  커널모듈의 모든 심볼을 공개하지 않는다.
     - EXPORT_SYMBOL(name)               :  name이라는 심볼만 공개
     - EXPORT_SYMBOL_NOVERS(name)  :  name이라는 심볼을 버전정보를 제거하고 공개

- int main(int argc, char* argv[]) 처럼
  ○ 커널모듈에서도 메모리 적재시 MODULE_PARM(변수명, 타입) 매크로를 이용해서 인자를 넘겨줄수 있다.
  ○ 타입의 종류
     - b : 1byte ( char, unsigned char, ...)
     - h : 2byte ( short, unsigned short, ...)
     - i  : 4byte ( int, unsigned int, ...)
     - l  : 4byte ( long int, unsigned long int, ...)
     - s : 문자열 (char 배열)

    ex) MODULE_PARM(name, "s");
          MODULE_PARM(count, "i");



※ 출처 : http://idkkangjs.blog.me/30091117058

by 민트앤라떼 2011. 9. 28. 17:08