【0001】第一个驱动程序及测试

【说明】第一个驱动程序及测试

【源码hello.c】

 1 /**************************
 2 *FILE_NAME:hello.c
 3 ***************************/
 4 
 5 #include <linux/init.h>
 6 #include <linux/module.h>
 7 
 8 
 9 static int __init hello_init(void)
10 {
11     printk(KERN_INFO "hello enter...\n");
12     return 0;
13 }
14 
15 static void __exit hello_exit(void)
16 {
17     printk(KERN_INFO "hello exit...\n");
18 }
19 
20 module_init(hello_init);
21 module_exit(hello_exit);
22 
23 MODULE_LICENSE("GPL v2");
24 MODULE_AUTHOR("OzTaking");
25 MODULE_DESCRIPTION("first simple programme");

【Makefie模板书写】

obj-m:=hello.o
PWD            =$(shell pwd)
KERNEL_DIR    =/lib/modules/$(shell uname -r)/build

default:
    $(MAKE) -C $(KERNEL_DIR) M=$(PWD) modules

.PHONY: clean
clean:
    $(RM) *.o *.ko *.cmd *.order *.symvers ./tem_versions/ *.mod.c -rf
(1)obj-m := hello.o

              表明有一个模块要从目标文件 hello.o 建立. 在从目标文件建立后结果模块命名为 hello.ko。

(2)KERNELDR := /usr/src/linux-2.6.26

              用来定位内核源码目录

(3)PWD := $(shell pwd)

             获得当前目录路径

(4)M=$(PWD) M= 选项

              使 makefile 在试图建立模块目标前, 回到你的模块源码目录

 (5)$(MAKE) -C $(KERNELDR) M=$(PWD) modules

              这个命令开始是改变它的目录到用 -C 选项提供的目录下( 就是说, 你的内核源码目录 ). 
     它在那里会发现内核的顶层 makefile. 这个 M= 选项使 makefile 在试图建立模块目标前, 
     回到你的模块源码目录. 这个目标, 依次地, 是指在 obj-m 变量中发现的模块列表, 
     在我们的例子里设成了 module.o.

(6)$(MAKE) -C $(KERNELDR) M=$(PWD) modules_install

             用于模块的安装

 (7)rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions

             用于make clean清除上次编译生成的文件

 

三. 编译与加载
注意:只有超级用户可以加载和卸载模块 .

【Makefile书写注意】

④其中的(MAKE) (RM)的前面需要添加“$”符号;否则出现下面的BUG;

 

 

 

【modinfo命令】

【proc虚拟文件系统下对应的模块信息查看】

【sys文件系统下的对应模块信息的查看】

 【modprobe指令的使用】--未操作成功;

modprobe比insmod的功能更强大,在加载模块的同时会加载该模块所依赖的其他模块;

对应的卸载模块指令:“modeprobe -r filename”,同时卸载其依赖的模块;

[参考链接]来自: http://man.linuxde.net/modprobe

modprobe命令用于智能地向内核中加载模块或者从内核中移除模块。 modprobe可载入指定的个别模块,或是载入一组相依的模块。modprobe会根据depmod所产生的相依关系,决定要载入哪些模块。若在载入过程中发生错误,在modprobe会卸载整组的模块。

-a或--all:载入全部的模块;

-c或--show-conf:显示所有模块的设置信息;

-d或--debug:使用排错模式;

-l或--list:显示可用的模块;

-r或--remove:模块闲置不用时,即自动卸载模块;

-t或--type:指定模块类型;

-v或--verbose:执行时显示详细的信息;

-V或--version:显示版本信息;

-help:显示帮助。

===============
、modprobe 挂载新模块及新模块相依赖的模块
modprobe 我们常用的功能就是挂载模块,在挂载某个内核模块的同时,这个模块所依赖的模块也被同时挂载;当然modprobe 也有列出内核所有模块,更有移除模块的功能;下在我们举个例子说一说咱们常用的功能和参数;
modprobe [-v] [-V] [-C config-file] [-n] [-i] [-q] [-o ] [parameters...]
modprobe -r [-n] [-i] [-v] ...
modprobe -l -t [ -a ...]
上面是modprobe 的用法,具体更为周详的帮助,我们能查看 man modprobe ;
[root@localhost beinan]# modprobe -c
modprobe -c 能查看modules 的设置文件,比如模块的别名是什么等;
[root@localhost beinan]# modprobe -l
modprobe -l 是列出内核中所有的模块,包括已挂载和未挂载的;通过modprobe -l ,我们能查看到我们所需要的模块,然后根据我们的需要来挂载;其实modprobe -l 读取的模块列表就位于 /lib/modules/’uname -r’ 目录中;其中uname -r 是内核的版本;
[root@localhost beinan]# uname -r
2.6.11-1.1369_FC4
[root@localhost beinan]# ls /lib/modules/2.6.11-1.1369_FC4/
通过上面的命令,自己试试看?
[root@localhost beinan]# modprobe 模块名 注:挂载一个模块;
举例:
[root@localhost beinan]# modprobe ne2k-pci 注:挂载 ne2k-pci 模块;
[root@localhost beinan]# modprobe vfat 注:挂载vfat 模块
[root@localhost beinan]# modprobe ntfs 注:挂载ntfs 模块
[root@localhost beinan]# lsmod 注:列出已挂载模块, 我们会看到ne2k-pci ,vfat ,ntfs的模块 ;
注意: 模块名是不能带有后缀的,我们通过modprobe -l 所看到的模块,都是带有.ko 或.o后缀;
[root@localhost beinan]# modprobe -r 模块名 注:移除已加载的模块,和rmmod 功能相同;
注意: 模块名是不能带有后缀的,我们通过modprobe -l 所看到的模块,都是带有.ko 或.o后缀;
[root@localhost beinan]# modprobe -r 模块名
举例:
[root@localhost beinan]# modprobe -r ne2k-pci
就说这么多吧,更为周详的还是用 man modprobe 来查看和尝试;
===================

 

posted @ 2017-04-25 16:41  OzTaking  阅读(164)  评论(0)    收藏  举报