zhangjian950617 发表于 2017-6-1 12:56:22

linux驱动模板

同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

注意:
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)/buildM=$(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
页: [1]
查看完整版本: linux驱动模板