首先在终端vim一个文件名为hello.c,输入内容如下:
1 #include <Linux/module.h> 2 #include <linux/init.h> 3 4 MODULE_LICENSE("GPL"); 5 MODULE_AUTHOR("Snooy"); 6 7 static int howmany = 10; 8 module_param(howmany,int,S_IRUGO); 9 10 static char *name = "Snooy"; 11 module_param(name,charp,S_IRUGO); 12 13 static __init int hello_init(void) //只被用一次就丢弃__init 14 { 15 int i = 0; 16 for(; i<howmany; i++) 17 printk(KERN_EMERG"this is %s!\n",name); 18 return 0; 19 } 20 21 static __exit void hello_exit(void) 22 { 23 printk("<0>goodbye!\n"); 24 } 25 26 module_init(hello_init); //module_...是一个宏 27 module_exit(hello_exit); 28 //另一种写法如下: 29 //若不要18/19行,则7,13行可改为函数的如下: 30 //int init_module(void) 函数调运 31 //void exit_module(void) 函数调运
编写编译需要的Makefile(注意这里好像必须大写M,否则报错),内容如下:
1 ifeq ($(KERNELRELEASE),) 2 KERNELDIR ?= /usr/src/kernels/2.6.18-164.el5-i686/ #这里的路径依据自己虚拟机linux版本决定(查看指令:uname -r) 3 PWD := $(shell pwd) #这里获取带扩展的路径 4 modules: 5 $(MAKE) -C $(KERNELDIR) M=$(PWD) modules 6 7 .PHONY: clean 8 clean: 9 rm -rf *.ko *.o Module* *.mod* 10 else 11 obj-m := hello.o 12 endif
解释:该Makefile在执行make时会进入两次,具体自己根据if等理解。
使用指令:
insmod hello.ko 安装模块
lsmod 查看已安装模块
rmmod hello 或 rmmod hello.ko 删除模块
dmesg 查看模块运行信息(最后几行),或者查看cat /var/log/messages信息也行。
到此一个简单的入门驱动模块编写安装与体验结束。
转自:http://blog.csdn.net/yanbober/article/details/8278434