linux内核最小模块代码

linux内核最小模块

在 Linux 里整体的框架是十分庞大的,里面包含了各种各样的组件,文件的数量也十分的庞大。那么怎样把这些文件加载到内核里面呢?

Linux 对驱动有两种处理方式:

  • 把需要的功能在一开始全部编译进内核
  • 动态加载内核

最小模块代码(打印语句)

#include <linux/init.h> /*module_init  module_exit*/
#include <linux/module.h> /*包含MODULE_LICENSE 文件*/

// 模块信息
MODULE_LICENSE("Dual BSD/GPL"); /*声明是开源的,没有内核版本限制 */
MODULE_AUTHOR("HLJ");/*声明作者*/

static int hello_init(void)
{
    printk(KERN_EMERG "hello_init\n");
    printk("This is the mini_linux_moduel\n");
}

static void hello_exit(void)
{
    printk("hello exit \n");
}

module_init(hello_init);
module_exit(hello_exit);

MODULE_LICENSE("Dual BSD/GPL"); 声明是开源的,没有内核版本限制 这一句代码声明你遵循 GPL 协议,否则模块在加载的时候,内核会提示被污染的“警报”


printk 函数是在内核中使用的,不是用户空间的 printf 函数,不过用法类似。这个函数在写驱动的时候,几乎都会用到,这是一个必须掌握的调试方法,也是最基本的方法因为最终的目标是用户能够自己写代码和调试驱动,那么这个 Debug 能力是一定要具备的。打印函数 printk 向超级终端传递数据,KERN_EMERG 是紧急情况的标识

打印函数 printk 是分级的,它的 8 个级别如下:

#define KERN_EMERG 0
/*紧急事件消息,系统崩溃之前提示,表示系统不可用*/
#define KERN_ALERT 1
/*报告消息,表示必须立即采取措施*/
#define KERN_CRIT 2
/*临界条件,通常涉及严重的硬件或软件操作失败*/
#define KERN_ERR 3
/*错误条件,驱动程序常用 KERN_ERR 来报告硬件的错误*/
#define KERN_WARNING 4
/*警告条件,对可能出现问题的情况进行警告*/
#define KERN_NOTICE 5
/*正常但又重要的条件,用于提醒*/
#define KERN_INFO 6
/*提示信息,如驱动程序启动时,打印硬件信息*/
#define KERN_DEBUG 7
/*调试级别的消息*/

模块许可声明

LICENSE 声明描述内核的许可权限,如果不声明 LICENSE,模块被加载的时候,会受到内核被污染的警告.Linux 在使用的过程中,需要接受 GPL 协议,体现在代码中就是添加类似MODULE_LICENSE("Dual BSD/GPL")的语句。


在 Linux 内核模块领域,可接受的 LICENSE 参数包括“GPL”、“GPL v2”、"GPL andaddtional" 、"Dual BSD/GPL"、"Dual MPL/GPL" 等,当参数是前面的几个时,那么就表明你遵循 GPL 协议
还有一个参数"Proprietary",这个参数表明是私有的,除非你的模块显式地声明一个开源版本,否则内核也会默认你这是一个私有的模块(Proprietary)。

小贴士:GPL 协议简介
GPL,是 General Public License 的缩写,是一份 GNU 通用公共授权非正式的中文翻译。GPL 协议中一个很核心的内容是:如果你接受这个协议,那么你就可以免费使用 Linux 中的代码,当你免费使用 Linux 的代码开发出新的代码,那么你就应该以源码或者二进制文件的方式免费发布;如果你不接受这个协议,那么你就无权使用 Linux 源码。


模块加载

在模块加载的时候调用module_init(hello_init)里面的函数(这个例子是hello_init这个函数)。

模块卸载

在模块加载的时候调用module_exit(hello_exit)里面的函数(这个例子是hello_exit这个函数)。

猜你喜欢

转载自blog.csdn.net/m0_63790530/article/details/121309665