- 注册时间
- 2011-3-6
- 最后登录
- 1970-1-1
该用户从未签到
|
同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 [/code]
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
[/code]
注意:
Makefile无后缀名,且M是大写
make –C之前是一个tab键而不是空格
如果只有一个C文件,那么hello.o要与hello.c同名
make不能使用sudo
使用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
[/code]
安装运行
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 |
|