linux内核添加模块


参考:

http://blog.csdn.net/gaoguoxin2/article/details/50220665

动态添加模块不需要编译内核。

LINUX的模块主要由6部分组成:

      1、模块的加载函数(必须)

            当通过insmod或modprobe命令加载内核模块时,模块的加载函数会自动被内核执行,完成本模块的相关初始化工作。

      2、模块的卸载函数(必须)

            当通过rmmod命令卸载某模块时,模块的卸载函数会自动被内核执行,完成与模块加载函数相反的功能。

      3、模块许可证声明

            模块许可证(LICENSE)声明描述内核模块的的许可权限,如果不声明LICENSE,模块被加载时,将接到内核被污染的警告。

      4、模块参数(可选)

            模块参数是模块被加载的时候可以被传递给它的值,它本身对应模块内部的全局变量。

      5、模块导出符号(可选)

            内核模块可以导出符号(symbol,对应于函数或者是变量),这样其他模块就可以使用本模块中的变量或者是函数。

      6、模块作者等信息声明(可选)

 

      知道了LINUX模块的组成后,我们来编写一个简单的LINUX内核模块hello.c

      在内核源代码树形目录的drivers目录下新建一个文件夹,名字为testmod,然后进入此文件夹中,创建我们的.c源文件,hello.c:

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>

static int hello_init(void)
{
printk(KERN_ALERT "Hello world enter!\n");
return 0;
}

static void hello_exit(void)
{
printk(KERN_ALERT "Hello world exit...\n");
}

module_init(hello_init);
module_exit(hello_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("rao");

 

源代码编写完之后,接下来我们添加MAKFILE编译文件,首先修改drvier目录下的MAKEFILE文件,添加testmod目录到此MAKEFILE

修改drvier目录下的MAKEFILE文件,在最后一行添加:

  obj-y += testmod/

然后在testmode目录下,添加一个MAKEFILE 文件,文件的内容为:

  obj-m := hello.o

做好上面的准备工作之后,我们开始编译模块文件,使用如下的编译命令:

      make -C /usr/src/kernels/`uname -r` M=/usr/src/kernels/`uname -r`/drivers/testmod  modules

     输入以上命令之后,我们将会成功得到模块文件,hello.ko

 

     当模块文件生成之后,使用命令insmod hello.ko加载模块,用命令dmesg  | tail -1, 我们将看到屏幕上打印Hello world enter!

     使用命令rmmod hello.ko卸载模块,用命令dmesg  | tail -1,我们将在屏幕看到打印Hello world exit...

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM