Linux 模块

2011-12-24 由 创建在标签 开发

1、模块简述

模块是内核的一部分(通常是设备驱动程序),但是并没有被编译到内核里面去。它们被分别编译并连接成一组目标文件,这些文件能被插入到正在运行的内核,或者从正在运行的内核中移走,进行这些操作可以使用insmod(插入模块)或rmmod(移走模块)命令。

使用模块有如下几个优点:

  • 模块化编程的需要,降低开发和维护成本。
  • 增强系统的灵活性,使得修改一些内核功能而不必重新编译内核和重启系统。
  • 降低内核编程的复杂性,使入门门槛降低。

同时也列出模块的一些缺点:

  • 对系统性能和内存利用有负面影响;
  • 装入的内核模块和其他内核一样,具有相同的访问权限,因此差的内核模块会导致系统崩溃;
  • 有些模块要求利用其他模块的功能,因此内核要维护模块之间的依赖性;
  • 内核必须能够在卸载模块时通知模块,并且要释放分配给模块的内存和中断等资源;
  • 内核版本和模块版本的不兼容也可能导致系统崩溃(内核版本不同时,部分接口需要替换);

但是对于驱动开发的过程中可以在运行时加载和移除模块显示得尤为重要,这样很容易让模块加载到内核中,而不必在编译的时候将模块编译进去,做过Linux裁剪的都应该知道编译内核是比较烦的一件事情,而且驱动程序开发中很容易出现问题,一旦出现问题就要重新编译。采用模块的方式可以很好地避免内核的重新编译,直到驱动版本稳定后可以将驱动加入至内核。可以大幅提高开发的效率。

2、模块常用的一些命令

3、常用的函数和宏

模块加载函数:  (必须)

模块卸载函数:   (必须)

模块参数:

在模块插入时:

eg:

导出符号

模块声明

4、模块的Makefile

下面是只包含一个文件的模块中所写出的Makefile:

如果一个模块包括多个.c文件(如file1.c, file.c),则应该以如下方式编写Makefile

附录

最简单的Hello模块代码:

/**
 *  Hello.c
 */
#include <linux/init.h>
#include <linux/module.h>

static int hello_init(void)
{
    printk(KERN_INFO " Hello World enter\n");
    return 0;
}

static void hello_exit(void)
{
    printk(KERN_INFO " Hello World exit\n ");
}

module_init(hello_init);
module_exit(hello_exit);

MODULE_AUTHOR("XXX");
MODULE_LICENSE("Dual BSD/GPL");
MODULE_DESCRIPTION("A simple Hello World Module");
MODULE_ALIAS("a simplest module");

无评论

发表评论