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에 따라 라이센스가 부여됩니다.