在linux下驱动模块可以分为静态和动态。
静态编译的话要在linux内核编译的时候加载进去,而动态的话可以随时加载和卸载,两个编写的程序相同,所以在测试时采用动态编译比较方便。
这里可以通过nfs挂载文件测试文件。
1、编写linux下hello驱动
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
static int __init hello_init(void)
{
printk("hello world!");
return 0;
}
static int __exit hello_exit(void)
{
printk("goodbye world! \n");
return 0;
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
2、编写Makefile文件(注意Makefile的书写格式)
obj-m:=hello.o
KDIR:=/wyl/linux-3.0.1
all:
make -C $(KDIR) M=$(shell pwd) modules
clean:
make -C $(KDIR) M=$(shell pwd) clean
note:KDIR为linux内核的路径,根据自己的存放位置进行修改。
3、执行make 命令
完成后可以在文件目录中看到新生成的文件:hello.ko,这个就是我们想要的驱动模块
4、测试模块
将hello.ko复制到/nfs/root目录中
在dnw窗口中进入mnt 目录,可以看到 hello.ko文件,复制到/tmp文件夹下面
执行insmod hello.ko命令进行装载
输入lsmod看是否装载成功
可以看到hello装载成功,但是为什么没有输出呢?
这就是printk和printf的区别:
printk根据日记的级别,将消息打印到当前的控制台上面;
可以将上面的两个printk改写为:
printk("<0>""goodbye world! \n");//最高级别
printk("<0>""goodbye world! \n");
重新按照上面的步骤编译加载。
可以看到现在已经有输出了,说明挂载成功了!