[Ubuntu] Linux 模块编程

来源:互联网 发布:电机拖动与控制网络课 编辑:程序博客网 时间:2024/05/16 01:26

  首先需要构建系统内核的源代码树,因为 模块属于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等驱动程序




原创粉丝点击