【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 来查看和尝试;
===================
浙公网安备 33010602011771号