linux驱动helloworld
环境:centOS5;x86_64
[root@test include]# uname -r 2.6.18-308.8.2.el5
首先构建一个内核树:上http://www.kernel.org/pub/linux/kernel/ 找对应版本。下载 解压到/usr/src/目录
#cd /tmp #wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.tar.bz2 #tar jxvf linux-2.6.18.tar.bz2 -C /usr/src/
把usr/include/里的asm linux scsi重定向到新下载的内核中
#rm -rf /usr/include/asm /usr/include/linux /usr/include/scsi #ln -s /usr/src/linux-2.6.18/include/asm-x86_64 /usr/include/asm #ln -s /usr/src/linux-2.6.18/include/linux /usr/include/linux #ln -s /usr/src/linux-2.6.18/include/scsi /usr/include/scsi
开始编译
#cd /usr/src/linux-2.6.18 #make mrproper #make defconfig #make #make modules #make modules_install #make install
编译完成。可以make help | less看make选项的意思
开始helloworld
#cd #mkdir -p /dv/hello #cd /dv/hello #vi hello.c
hello.c
#include <linux/init.h> #include <linux/module.h> MODULE_LICENSE("DUAL BSD/GPL"); static int hello_init(void) { printk(KERN_ALERT "dv_hello world\n"); return 0; } static void hello_exit(void) { printk(KERN_ALERT "dv_goodbye\n"); } module_init(hello_init); module_exit(hello_exit);
Makefile
obj-m := hello.o PWD := $(shell pwd) KVER := $(shell uname -r) KDIR := /lib/modules/$(KVER)/build all: $(MAKE) -C $(KDIR) M=$(PWD) modules clean: rm -f *.o *.ko *.mod.c .hello*
make一下生成一堆文件
[root@test hello]# ls hello.c hello.mod.c hello.o Module.markers hello.ko hello.mod.o Makefile Module.symvers
加载模块和卸载模块
#insmod ./hello.ko #rmmod hello
看看日志#cat /var/log/messages,可以看到hello.ko打印出的信息
Nov 8 17:47:35 test kernel: hello world Nov 8 17:47:38 test kernel: goodbye
为了效果更明显可以用tmux分出一个屏用watch -n 1 tail -n 3 /var/log/messages 或者tail -f /var/log/messages来监视日志输出