Linux内核模块

1、最简单的内核模块应该包含三个部分:

    1)内核模块加载函数  函数定义 + 指定

    2)内核模块卸载函数 函数定义 + 指定

    3)对许可证的声明  


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

//内核模块加载函数
static int __init hello_init(void)
{
    printk(KERN_INFO "hello world enter\r\n");
    return 0;
}
module_init(hello_init);   //指定加载函数


//内核模块卸载函数
static void __exit hello_exit(void)
{ 
    printk(KERN_INFO "hello world exit\r\n");
}
module_exit(hello_exit); //指定卸载函数

//许可证的声明,必须有
MODULE_LICENSE("GPL v2");


//别的描述性信息,非必须
MODULE_DESCRIPTION("hello world module");  //模块描述
MODULE_ALIAS("test module");    //模块别名
MODULE_AUTHOR("your name");  //作者信息

此外还有两部分可选

 4)模块参数,即可以向模块传递一些参数,模块本身也可以设置默认参数

 5)模块导出符号,类似于Window的DLL库,可以编写库函数为模块的形式提供给其他函数调用其变量或函数


2、Linux内核模块加载函数,需要以__init标识声明,模块加载函数有int类型返回值,加载正常返回0,加载异常返回负数

     Linux内核模块卸载函数,需要以__exit标识声明,模块卸载函数没有返回值,是void型

3、相关命令

        1)Linux中查看已加载的所有模块及模块间的依赖关系命令:

               # lsmod     //该命令实际是读取分析/proc/modules 文件

        2)加载已编译好的.ko模块命令

           #insmod  xxx.ko     //加载xxx.ko模块,该命令只加载该模块

            或者

           #modprobe xxx.ko  //也是加载xxx.ko模块,该命令会一并加载xxx.ko模块所依赖的其他模块

            注意:模块之间的依赖关系存放在根文件系统 /lib/modules/<kernel-version>/modules.dep文件中

        3)卸载已加载的模块命令:

            #rmmod xxx.ko   //卸载已加载的xxx.ko模块

            或者

            #modprobe -r xxx.ko  //卸载xxx.ko及其依赖模块

        4)查看模块信息:

           #modinfo  xxx.ko  //查看模块的信息,比如说明作者通行证参数等


4、其他

        1) 内核已加载的模块信息也存在于 /sys/modules目录下,每加载一个xxx.ko,在该目录下就会生成一个xxx目录,在xxx目录下运行#tree -a 可得到该目录的目录树

        2)printk是内核空间级别的打印函数

             printf是用户空间级别的打印函数,

             printk打印函数可以定义输出级别,是最基本的内核调试手段。

             printk函数所打印的信息全部输出在 /var/log/messages 日志文件中




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值