커 널 프로 그래 밍 hello World(회전)

이 글 은 아주 좋 습 니 다.http://edsionte.com/techblog/archives/1350
 
커 널 모듈 프로 그래 밍 을 배 웁 니 다.첫 번 째 작은 프로그램 은 당연히 hello,kernel 입 니 다!자,이것 은 관례 라 고 할 수 있 습 니 다.예전 에 대학 3 학년 때 실험 시간 에 모듈 프로 그래 밍 을 했 는데 그 때 는 허 사형 이 우 리 를 데 리 고 실험 한 것 을 기억 하 는데 지금 은 또 잊 어 버 렸 다.저녁 에 시험 해 보 았 더 니 곧 운행 에 성 공 했 지만 약간의 문제 가 생 겼 다.지금 나의 절 차 를 아래 와 같이 기록 하여 나 와 같은 초보 자 들 이 공부 하도록 제공 합 니 다.
1.먼저 hello.c 파일 을 작성 합 니 다.01 #include <linux/init.h> 02 #include <linux/module.h> 03 #include <linux/kernel.h> 04 // 05 // 06 MODULE_LICENSE( "Dual BSD/GPL" ); 07 // 08 static int hello_init( void ) 09 { 10      printk(KERN_ALERT "hello,I am edsionte/n" ); 11      return 0; 12 } 13 // 14 static void hello_exit( void ) 15 { 16      printk(KERN_ALERT "goodbye,kernel/n" ); 17 } 18 // 19 module_init(hello_init); 20 module_exit(hello_exit); 21 // 22 MODULE_AUTHOR( "edsionte Wu" ); 23 MODULE_DESCRIPTION( "This is a simple example!/n" ); 24 MODULE_ALIAS( "A simplest example" );
보통 모듈 프로그램의 경우 모듈 로드 함수,모듈 마 운 트 해제 함수 와 모듈 허가 성명 은 필수 적 이 며,모듈 파라미터,모듈 내 보 내기 기호 와 모듈 작성 자 정보 성명 등 은 모두 선택 할 수 있 습 니 다.
우 리 는 모듈 로 함 수 를 불 러 온 후에 module 를 사용 해 야 합 니 다.init(mode_name);이 함 수 를 등록 합 니 다.다음 에 inmod 로 모듈 을 불 러 올 때 커 널 은 커 널 로 딩 함 수 를 자동 으로 찾 아 실행 하여 초기 화 작업 을 완성 하기 때 문 입 니 다.유사 한 것 은 rmmod 명령 을 사용 할 때 커 널 은 커 널 마 운 트 해제 함 수 를 자동 으로 실행 합 니 다.
이 printk 함 수 를 주의 하 십시오.커 널 의 printf 함수 로 간단하게 이해 할 수 있 습 니 다.처음 사용 하면 printf 로 만 들 기 쉽 습 니 다.
2.Makefile 파일 작성
대학 3 학년 때 실험 시간 에 Makefile 을 만 났 는데 책 에 있 는 내용 대로 만 두 드 렸 던 기억 이 납 니 다.하지만 지난주 Makefile 관련 문법 에 대한 이해 가 생 겨 서 이 제 는 왜 이렇게 쓰 는 지 거의 알 것 같 습 니 다.그럼 다음은 Makefile 파일 을 보 겠 습 니 다.
view source print ? 01 obj-m += hello.o 02 #generate the path 03 CURRENT_PATH:=$(shell pwd) 04 #the current kernel version number 05 LINUX_KERNEL:=$(shell uname -r) 06 #the absolute path 07 LINUX_KERNEL_PATH:=/usr/src/linux-headers-$(LINUX_KERNEL) 08 #complie object 09 all: 10      make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules 11 #clean 12 clean: 13      make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean
우선 첫 마디 로 컴 파일 할 파일 을 지정 합 니 다.사실 Makefile 에 이런 말 이 있 으 면 됩 니 다.하지만 이렇게 되면 make 할 때마다 다른 명령 을 추가 해 야 하기 때문에 Make 에 매번 실행 할 명령(스 크 립 트 언어의 기능 이 구현 되 었 습 니 다)을 추가 하 는 것 도 좋 습 니 다.매번 make 명령 만 입력 하면 됩 니 다.
우 리 는 먼저 현재 의 상대 경 로 를 얻 었 습 니 다.(터미널 에 pwd 를 입력 하여 이 명령 을 시험 해 볼 수 있 습 니 다)그리고 현재 커 널 의 버 전 번 호 를 얻 으 면 현재 커 널 의 절대 경 로 를 직접 얻 을 수 있 습 니 다.물론 현재 커 널 버 전 을 직접 입력 할 수 있 지만 이식 이 불편 합 니 다.현재 커 널 버 전 번호 가 이 파일 의 버 전 번호 와 같 지 않 으 면 수정 해 야 합 니 다.그래서 위의 방법 은 이식 성 이 좋 고 가 독성 도 강하 다.
$(variable name)와 같은 문자열 이 자주 나타 납 니 다.사실은 괄호 안의 변 수 를 참조 하 는 것 입 니 다.Makefile 과 관련 된 문법 규칙 을 참고 할 수 있 습 니 다.
3.make
상기 두 파일 을 완성 한 후 현재 디 렉 터 리 에서 make 명령 을 실행 하면 hello.ko 파일,즉 모듈 대상 파일 을 생 성 합 니 다.
4.insmod,rmmod 와 dmesg
inmod 명령 은 우리 가 쓴 이 모듈 을 커 널 에 추가 할 수 있 지만,일반적으로 우 리 는 sudo 를 추가 해 야 합 니 다.rmmod 는 당연히 이 모듈 을 마 운 트 해제 하 는 것 입 니 다.모듈 을 불 러 오 거나 마 운 트 해제 할 때 우리 printk 에 표 시 된 문 구 는 dmesg 명령 으로 볼 수 있 습 니 다.
ok,첫 번 째 모듈 프로 그래 밍 이 이렇게 간단 합 니 다.try 해 보 세 요!
Update 2011/04/03
본 고 에서 기술 한 프로그램 은 ubuntu 시스템 에서 테스트 에 성공 했다.다른 Linux 발행 판 은 소스 디 렉 터 리,즉 LINUX 를 적 절 히 수정 해 야 합 니 다.KERNEL_PATH。

좋은 웹페이지 즐겨찾기