LINUX 드라이버 Hello World

4927 단어
jjzhang166에서 전재
최종 편집
http://hi.baidu.com/ah%5F%5Ffu/blog/item/57b76201e27095de267fb5d4.htmlLINUX의 내부 핵과 구동 개발을 열심히 공부하기로 결심했습니다. 천만 명의 비웃음을 두려워하지 않고 용감하게 자신의 학습 과정을 썼습니다.
1. 디렉토리 정보
   /lib/modules/2.6.9-42.ELsmp/build/이것은 커널 소스가 있는 디렉토리입니다.
일반적으로 이 디렉터리에 이 명령을 사용합니다: cd/lib/modules/$(uname -r)/build/
이 디렉터리는 실제로 다음과 같습니다:/usr/src/kernels/2.6.9-42.EL-smp-i686
2, 컴파일 드라이브에 사용된makefile
실제로 드라이브를 컴파일할 때 미리 제공된makefile을 사용합니다. 위치는 다음과 같습니다.
/lib/modules/$(uname -r)/build/Makefile
참고: M은 대문자입니다.
3. 인터넷에서 베낀 Linux가 Hello World를 구동하는 원본 코드:
//hello.c
#include
#include
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void)
{
    printk(KERN_ALERT "hello world!");
    return 0;
}
static void hello_exit(void)
{
    printk(KERN_ALERT "goodbye!");
}
module_init(hello_init);
module_exit(hello_exit);
4,makefile을 써서 이 드라이브를 컴파일하십시오: (버전 1, 가장 간단)
# 아래 줄은 파일Makefile의 내용입니다. M은 대문자입니다.
obj-m := hello.o
hello를c 및 Makefile은 같은 디렉토리에 저장된 후 다음을 수행합니다.
make -C/lib/modules/`uname -r`/build SUBDIRS=$PWD modules
이렇게 구동하면 컴파일할 수 있습니다. 성과는 Hello입니다.ko 파일.
주의:makefile은Makefile로 써야 합니다.makefile로 쓰면 컴파일할 수 없습니다.(뒤척이다, 이 한 걸음에 N여 시간이 걸렸다)
5. 다른 Makefile 쓰기: (버전 2: 가장 편리한)
#다음은 Makefile 파일의 내용
obj-m := hello.o
KERNEL_DIR :=/lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
all:
    make -C $(KERNEL_DIR) SUBDIRS=$(PWD) modules
clean:
    rm *.o *.ko
그리고 실행:make는 컴파일에 성공했습니다. 명령줄에 인자를 추가하지 않아서 매우 편리합니다.
주의: all: clean: 아래 줄, 앞에는 TAB 키
6. 로드 드라이브:
실행
insmod ./hello.ko
화면에 반응이 없어요.(내가 WINDOWS에서 원격 터미널로 연결했으니까)
OK. 시간을 되돌리고 로드 드라이브로 돌아가기 전에 다른 창을 열고 다음을 수행합니다.
tail -f/var/log/message
그런 다음 원래 창에서 다음을 수행합니다.
insmod ./hello.ko
하하,/var/log/message 파일에서 오랫동안 기다리던 Hello World를 보았습니다!
7. 드라이버를 보려면:
lsmod에서 Hello 드라이브가 있는 걸 봤어요.
8. 마운트 해제 드라이브:
rmmod hello 
보이다/var/log/메시지 goodbye
 
컴파일된 Helloworld 프로그램에 부록됨
hello.c 01 #include <linux/init.h> 02
  03 #include <linux/module.h> 04
  05
  06
  07 static   int   hello_init( void ) 08
  09 { 10
  11      printk(KERN_INFO  " Hello World enter
"
); 12
  13      return   0; 14
  15 } 16
  17
  18
  19 static   void   hello_exit( void ) 20
  21 { 22
  23      printk(KERN_INFO  " Hello World exit
"
); 24
  25 } 26
  27
  28
  29 module_init(hello_init); 30
  31 module_exit(hello_exit); 32
  33
  34
  35 MODULE_AUTHOR( "Barry Song <[email protected]>" ); 36
  37 MODULE_LICENSE( "Dual BSD/GPL" ); 38
  39 MODULE_DESCRIPTION( "A simple Hello World Module" ); 40
  41 MODULE_ALIAS( "a simplest module" );
Makefile
view source print ? 01 KVERS = $(shell uname -r) 02
  03 # Kernel modules 04 obj-m += hello.o 05
  06 # Specify flags for the module compilation. 07 #EXTRA_CFLAGS=-g -O0 08
  09 build: kernel_modules 10
  11 kernel_modules: 12      make -C /lib/modules/$(KVERS)/build M=$(CURDIR) modules 13
  14 clean: 15      make -C /lib/modules/$(KVERS)/build M=$(CURDIR) clean

좋은 웹페이지 즐겨찾기