我们编写 Linux 内核模块的软件代码,通过某种方式将其加载到内核空间进行生效,相当于是给 Linux 内核安装了一个实现特定功能的插件。
// filename: demo.c
#include <linux/init.h>
#include <linux/module.h>
static int __init mycdev_init(void)
{
return 0;
}
static void __exit mycdev_exit(void)
{
}
module_init(mycdev_init);
module_exit(mycdev_exit);
MODULE_LICENSE("GPL");
static 声明当前函数只能在当前文件中使用int 声明返回类型,且必须返回,否则编译报错__init 是一个宏,它的作用是指定入口函数放在 .init.text 段中mycdev_init 和 mycdev_exit 函数名可以更换voidmodule_init 是一个宏函数,用于向内核声明当前内核模块的入口函数地址module_exit 同上,用于向内核声明当前内核模块的出口地址MODULE_LICENSE 声明当前模块遵循 GPL 协议内核模块的编译依赖内核源码,因为需要使用内核提供的接口。编译的方式有两种:1. 内部编译;2. 外部编译
一类内核源码树进行编译,也就是将自己的内核模块文件添加到内核源码树,通过内核模块编译命令进行编译(Linux 内核移植 的第 7 节)