Linux 커 널 모듈 과 드라이브 의 작성

4861 단어 Liinnuuxx 내핵심
리 눅 스 커 널 은 하나의 전체 구조 이기 때문에 커 널 에 어떤 것 을 추가 하거나 어떤 기능 을 삭제 하 는 것 도 매우 어렵다.이 문 제 를 해결 하기 위해 내부 핵 메커니즘 을 도입 하 였 다.커 널 에 모듈 을 추가 하거나 삭제 할 수 있 습 니 다. 모듈 은 커 널 에 컴 파일 되 지 않 아 커 널 의 크기 를 조절 합 니 다.그러나 모듈 이 커 널 에 삽입 되면 그 는 커 널 의 다른 부분 과 마찬가지 로 일부 시스템 에서 비용 을 지불 합 니 다.또한 모듈 에 문제 가 생기 면 시스템 붕 괴 를 가 져 올 수 있다.모듈 구현 메커니즘:시작 시 함수 void intimodules()는 모듈 을 초기 화 합 니 다.시작 할 때 모듈 이 없 을 때 가 많 기 때 문 입 니 다.이 함 수 는 커 널 자 체 를 가상 모듈 로 생각 합 니 다.시스템 이 필요 하 다 면 일련의 sys 로 시작 하 는 함 수 를 호출 하여 모듈 을 조작 합 니 다.예 를 들 어 syscreat_modules(),sys_inti_modules() ,   sys_deldte_modules()등등.여기 서 일부 모듈 의 데 이 터 를 사용 하여 구 조 를 구성 할 수 있 습 니 다./usr/scr/Linux/include/Linux/module.h 에서 관심 이 있 는 친 구 는 블록 을 찾 아 가입 하 는 두 가지 방법 이 있 습 니 다.하 나 는 수 동 으로 가입 하 는 것 입 니 다.예 를 들 어 insmod modulename.다른 하 나 는 수요 에 따라..동적 로드 모듈:명령 을 실행 할 때:$mount-t msdos/dev/hdd/mnt/d.시스템 은 자동 으로 FAT 모듈 을 불 러 와 MSDOS 파일 시스템 을 지원 합 니 다.1.모듈 프로 그래 밍 은 모듈 을 작성 합 니 다.다 중 프로 세 스 프로 그래 밍 기반 이 있어 야 합 니 다.프로그램 이 독립 된 프로그램 으로 실행 되 지 않 기 때 문 입 니 다.또한,모듈 은 커 널 모드 에서 실행 되 어야 하기 때문에 내부 공간 과 사용자 공간 데이터 교환 문제 가 발생 할 수 있 습 니 다.일반적인 데이터 복사 함수 로 는 이 과정 을 완성 할 수 없습니다.따라서 시스템 은 커 널 공간 과 사용자 공간 데이터 의 교환 을 완성 하기 위해 특수 한 함수 에 들 어 갔다.user (type valude,type *u_addr)   memcpy_tofs()등 관심 있 는 친 구 는 모든 함수 와 그들의 용법 을 자세히 볼 수 있 습 니 다.설명 이 필요 한 것 은 모듈 프로 그래 밍 하 커 널 버 전 은 매우 큰 관계 가 있 습 니 다.버 전이 통 하지 않 으 면 커 널 모듈 을 컴 파일 할 수 없 거나 이 모듈 을 실행 할 때 예측 할 수 없 는 결과 가 발생 할 수 있 습 니 다.시스템 붕괴 등.이 를 알 게 된 후에 당신 은 커 널 모듈 을 만들어 볼 수 있 습 니 다.모든 커 널 모듈 에 있어 서 두 개의 함수 int init 가 포함 되 어 있 습 니 다.module()이 함 수 는 커 널 을 삽입 할 때 시작 합 니 다.커 널 에 일정한 기능 함 수 를 등록 하거나 내부 와 중 일부 함수 의 내용 을 그의 코드 로 대체 합 니 다(이 함수 들 은 비어 있 을 것 으로 추정 합 니 다).따라서 내부 와 안전하게 마 운 트 해제 할 수 있 습 니 다.  int cleanup_module()커 널 모듈 을 감사 할 때 호출 합 니 다.모듈 을 커 널 에서 제거 합 니 다.다른 프로 그래 밍 튜 토리 얼 과 마찬가지 로 hello World 의 예/*hello.c a module programm*/*the program runing under kernel mod and it is a module*/\#include"Linux/kernerl.h"\#include"lLinux/module.h"/*pross the CONFIGMODVERSIONS*/ #if CONFIG_MODVERSIONS==1 #define MODVERSIONS #include""Linux/modversions.h" #end if /* the init function*/ int init_module() { printk(" hello world !'); printd(" I have runing in a kerner"); return 1; } /* the distory function*/ int cleanup_module() { printk(" I will shut down myself in kernerl mod /n)"; retutn 0; } 이러한 예 는 완성 되 었 습 니 다.우 리 는 또한 Makefile 의 예 를 써 서 우리 가 큰 프로그램 에서 다시 사용 할 수 있 도록 합 니 다.다음은 makfile 파일 의 내용 입 니 다.\#a makefile for a module CC=gcc MODCFLAGS:= -Wall _DMODULE -D_KERNEL_ -DLinux hello.o hello.c /usr/inculde?Linux/version.h CC $(MODCFLAGS) 0c hello.c echo the module is complie completely  그리고 make 명령 을 실행 하여 hello.o 이 모듈 을 얻 고$insmod hello.o hello World 를 실행 하 십시오!I will shut down myself in kernerl mod $lsmod hello (unused) …. $remmod I will shut down myself in kernerl mod  이렇게 하면 당신 의 모듈 은 마음대로 삽입 하고 삭제 할 수 있 습 니 다.Linux 의 대부분의 드라이버 는 모듈 형식 으로 작 성 됩 니 다.이 드라이버 소스 코드 는 커 널 에 수정 할 수도 있 고 모듈 형세 로 컴 파일 할 수도 있 습 니 다.필요 할 때 동적 으로 불 러 올 수도 있 습 니 다.전형 적 인 드라이버 는 대체적으로 몇 가지 부분 으로 나 눌 수 있다.1.등록 장 치 는 시스템 이 처음 시작 되 거나 모듈 을 불 러 올 때 반드시 장 치 를 해당 하 는 장치 배열 에 등록 하고 장치 의 주 구동 번 호 를 되 돌려 야 한다.예 를 들 어 빠 른 장치 에 있어 refister 를 호출 해 야 한다.blkdec()는 장 치 를 배열 blkdev 에 추가 하고 이 장치 번 호 를 얻 으 며 이 장치 번 호 를 이용 하여 이 배열 을 색인 합 니 다.문자 구동 장치 에 있어 서 module 을 사용 해 야 합 니 다.register_chrdev()는 축 장치 의 구동 번 호 를 얻 은 다음 에 이 장치 의 모든 호출 을 이 장치 번호 로 실현 합 니 다.2.기능 함 수 를 정의 하 는 것 은 모든 구동 함수 에 있어 이 장치 와 밀접 한 관 계 를 가 진 기능 함수 가 있 습 니 다.가장 자주 사용 하 는 블록 장치 나 문자 장치 에 있어 open()read()write()ioctrol()과 같은 작업 이 존재 합 니 다.시스템 사가 이러한 호출 을 사용 할 때 구동 함수 중의 특정한 모듈 을 자동 으로 사용 하여 구체 적 인 조작 을 실현 할 것 이다.특정한 장치 에 대해 위의 시스템 호출 에 대응 하 는 함 수 는 일정한 것 이다.예 를 들 어 블록 드라이버 에 있 습 니 다.시스템 이 이 장 치 를 읽 으 려 고 할 때(즉,read()드라이버 의 Block 을 실행 합 니 다.read()이 함수.새 장 치 를 열 때 이 장치 드라이버 의 device 를 호출 합 니 다.open()이 함수.    3.감사 모듈 은 이 장 치 를 사용 하지 않 을 때 그 를 마 운 트 해제 할 수 있 습 니 다.주로/proc 에서 이 장치 의 특수 파일 을 취소 하고 특정한 함수 로 이 루어 집 니 다.다음은 문자 장치 드라이버 의 프레임 워 크 를 열거 합 니 다.이 과정 을 설명 합 니 다./*a module of a character device*/*some include files*/\#include"param.h"\#include"user.h"\#include"tty.h"\#include"dir.h"\#include"fs.h"/*the include files modules need*/\#include"Linux/kernel.h"\#include"Linux/module.h"\#if CONFIGMODBERSIONS==1 degine MODBERSIONS #include" Linux.modversions.h" #endif #difine devicename mydevice /* the init funcion*/ int init_module() { int tag=module_register_chrdev(0,mydevice,&Fops); if (tag<0) { printk("the device init is erro!"); return 1; } return 0; } /*the funcion which the device will be used */ int device_open () { ……. } int device_read () { ……. } int device_write () { ……. } int device_ioctl () { ……. } …… /* the deltter function of this module*/ int cleanup_module() { int re=module_unregister_chrdev(tag,mydevice); if( re<0) { printk("erro unregister the module !!"); return 1; } return 0; }

좋은 웹페이지 즐겨찾기