首先需要构建系统内核的源代码树,因为 模块属于kernel编程了,和用户空间的c语言变成不同。他要依附于内核源码树的存在而存在。
内核模块
一种机制能让内核文件(zImage或bzImage)本身并不包含某组件,而是在该组件需要被使用的时候,动态地添加到正在运行的内核中Linux提供了一种叫做“内核模块”的机制,就可以实现以上效果。
特点
•模块本身并不被编译进内核文件(zImage或者bzImage)
• 可以根据需求,在内核运行期间动态的安装或卸载。
第一步,创建源代码:hello.c
root@ubuntu:/home/Mydocument/Modules#vi hello.c
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("fudan_abc");
static int __init hello_init(void)
{
printk(KERN_ALERT "Hello, world!\n\n\n");
return 0;
}
static void __exit hello_exit(void)
{
printk(KERN_ALERT "Goodbye, cruel workd!\n\n\n");
}
module_init(hello_init);
module_exit(hello_exit);
第二步,创建Makefile
root@ubuntu:/home/Mydocument/Modules#vi Makeile
obj-m += hello.o
all:
make -C /usr/src/linux-headers-$(shell uname -r) M=$(shell pwd) modules
clean:
make -C /usr/src/linux-headers-$(shell uname -r) M=$(shell pwd) clean
第三步,编译
root@ubuntu:/home/Mydocument/Modules#make
root@ubuntu:/home/Mydocument/Modules#ls
hello.c hello.mod.o Module.symvers hello.ko
hello.o Makefile hello.mod.c modules.order
第四步, 安装模块
root@ubuntu:/home/Mydocument/Modules# insmod hello.ko
root@ubuntu:/home/Mydocument/Modules# lsmod
Module Size Used by
hello 12393 0
rfcomm 38408 0
bnep 17923 2
bluetooth 148839 10 rfcomm,bnep
parport_pc 32114 0
第五步, 查看输出, 卸载模块
root@ubuntu:/home/Mydocument/Modules#dmesg
[29665.689269] Hello, world!
root@ubuntu:/home/Mydocument/Modules# rmmod hello
root@ubuntu:/home/Mydocument/Modules# lsmod
http://hi.baidu.com/lieyu063/item/d390a9ecfbb8a2245a2d64d4
1,模块及其分类
什么是模块
Linux模块是一种在系统启动任何时候都可以动态链入内核的代码块。该机制使我们可以随意地、动态地加载与卸载操作系统部件。当我们不再需要某个功能部件时,可以将它对应的模块从内核中卸载并删除。Linux模块多指设备驱动程序、伪设备驱动程序,如文件系统的驱动程序等。
从结构上来讲,操作系统有微内核结构和单内核之分,Windows NT 和 Minix 是典型的微内核操作系统,而Linux是单内核的操作系统。微内核结构可方便地在内核中添加新的组件,而单内核却不容易做到这一点。为此,Linux支持可动态装载和卸载的模块。利用模块,可方便地在内核中添加新的组件,卸载不再需要的内核组件。
简单来说,一个模块提供了一个功能,如某个设备的驱动等。一般意义上来讲,模块化有两个方法解决:可以把各项功能分离到单独线程中处理,或者将内核以“包含/排除”一些功能的方式重新编译。如果把功能分离到线程中去,那么内核就是微内核。这种解决方法增加了线程间协调工作的通信开销。这种解决方案的优点在于内核的大小。
Linux的解决方案是包含内核模块,这些模块是可以按需要随时装入和卸下的。这样做可以使得内核的大小和通信量都达到最小。将模块从内核中独立出来,不必预先绑定在内核的源代码中。这样做有三种优点: 第一, 将来修改内核时,不必全部重新编译,可节省不少时间;第二, 若需要安装新的模块,只要插入 (通过insmod命令) 对应的模块即可;第三,减少内核对系统资源的占用,内核可以集中精力做最基本的事情,把一些扩展功能都交由模块实现。模块也可以用来尝试新的内核代码,而不需要每次都创建和重激活内核。
但是,内核模块也会带来一些问题:
Ø 对系统性能和内存利用有负面影响;
Ø 装入的内核模块和其他内核部分一样,具有相同的访问权限,因此,差的内核模块会导致系统崩溃;
Ø 有些模块要求利用其他模块的功能,因此,内核要维护模块之间的依赖性。
Ø 内核必须能够在卸载模块时通知模块,并且要释放分配给模块的内存和中断等资源;
Ø 内核版本和模块版本的不兼容也可能导致系统崩溃。
模块的分类
常见的模块一般可以分为以下几类
Ø 存储设备模块
Ø 文件系统模块
Ø TCP/IP通信协议模块
Ø 网卡驱动程序模块
Ø pcmcia驱动程序模块
Ø SCSI卡驱动程序模块
Ø video设备驱动程序模块
Ø 旧式光驱驱动模块
Ø 其他模块。如声卡、游戏杆、鼠标、ISDN等驱动程序