同NT驱动
一个DriverEntry 一个DriverUnload
不过在linux中不需要指定函数名
在初始化接口函数中填上你的函数名即可
#include <linux/kernel.h> #include <linux/module.h> MODULE_LICENSE ("GPL");//开源协议GPL 或者Dual BSD MODULE_AUTHOR ("TOM");//作者 MODULE_DESCRIPTION ("MY_TEST");//描述此驱动 //EXPORT_NO_SYMBOLS;//不导出函数 可以不写 //EXPORT_SYMBOL(hello_data);//导出hello_data int test_init(void) { printk(KERN_INFO "hello world\n"); return 0; } void test_exit(void) { printk(KERN_INFO "goodbye world\n"); } module_init(test_init); //注册DriverEntry module_exit(test_exit); //注册DriverUnload
Makefile
//EXTRA_CFLAGS := -g//一些编译选项 ;=的意思是在原来的数上加上其它编译选项 obj-m =hello.o //#hello-objs := file1.o file2.o,如果有多个源文件,加上这么一行 KVERSION = $(shell uname -r) all: make -C /lib/modules/$(KVERSION)/build M=$(PWD) modules clean: make -C /lib/modules/$(KVERSION)/build M=$(PWD) clean
使用KBUILD_EXTRA_SYMBOLS主要使用于下面这样的场合: 有两个我们自己的模块,其中Module B使用了Module A中export的函数,因此在Module B的Makefile中必须加上这样的选项 KBUILD_EXTRA_SYMBOLS += /path/to/Module A/Module.symvers(后面是绝对路径)这样在编译Module B时,才不会出现Warning,提示说func1这个符号找不到,而编译得到的ko加载时也会出错。
如果不使用 KBUILD_EXTRA_SYMBOLS,则需要将A模块编译之后的 Module.symvers文件拷贝到B模块下。
比如:
KBUILD_EXTRA_SYMBOLS = /mnt/hgfs/Linux/hellokernel/demo/hello-2/Module.symvers
obj-m =hello.o KVERSION = $(shell uname -r) KBUILD_EXTRA_SYMBOLS = /mnt/hgfs/MallocFreeIBM/Linux/10ten-hellokernel/demo/hello-2/Module.symvers all: make -C /lib/modules/$(KVERSION)/build M=$(PWD) modules clean: make -C /lib/modules/$(KVERSION)/build M=$(PWD) clean
sudo insmod hello.ko //加载hello.ko
sudo rmmod hello.ko //卸载hello.ko
sudo lsmod //显示ALL驱动
sudo modinfo hello //查看驱动信息
dmesg | tail //查看最近linux打印信息
sudo cat /proc/kmsg //同上
Ubuntu模块自启动:
将驱动拷到/lib/modules/2.6.32.65/kernel/lib/
/lib/modules/2.6.32.65/kernel/lib/hello.ko
编辑modules
/etc/modules
增加驱动名,不需要加ko