LINUX 드라이버 Hello World
최종 편집
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이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.