1、首先选择Linux系统这里以Centos7.4系统为例:
2、安装好编译环境:yum, make,gcc,vim;
3、新建一个文件夹
注意:
- Makefile 文件的命名注意M需要大写,否则会报错。
- 在Makefile文件中make命令前应为tab制表符。
hello.c文件内容为:
//必要的头文件
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
//模块许可证声明(必须)
MODULE_LICENSE("Dual BSD/GPL");
//模块加载函数(必须)
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_AUTHOR("XXX");
//声明模块的描述(可选)
MODULE_DESCRIPTION("This is a simple example!/n");
//声明模块的别名(可选)
MODULE_ALIAS("A simplest example");
Makefile文件内容为:
obj-m := hello.o
#generate the path
PWD:=$(shell pwd)
#the absolute path
KDIR:=/lib/modules/$(shell uname -r)/build
#complie object
all:
make -C $(KDIR) M=$(PWD) modules
#clean
clean:
make -C $(KDIR) M=$(PWD) clean
4、执行make命令,如果出现以下报错情况,先去/usr/src/kernels下查看是否有文件
执行:ls /usr/src/kernels 命令查看,可以看到系统没有安装内核开发包
1、执行命令:
UNAME=$(uname -r)
yum install gcc kernel-devel-${UNAME}
或者直接安装最新的包:yum install kernel-devel ;
成功之后;/usr/src/kernels文件夹下如下:
进入cd /lib/modules/目录下,该文件夹下有两个,cd 3.10.0目录下;
查看链接情况:ls -l
可以看到链接错误:
执行:rm -rfv build;删除链接;
重新执行链接:重新创建Build文件夹的软链接,目标地址从3.10.0版本的内核目录改为到3.10.0-1062.18.1.el7.x86_64版本的内核
ln -s /usr/src/kernels/3.10.0-1062.18.1.el7.x86_64 /lib/modules/3.10.0/build
进入:cd /haha重新编译:
执行:make命令之后;
lsmod:
modinfo [options] filename args
编译模块
#make
清除
#make clean
2,Makefile文件中的核心是
$(MAKE) -C $(KDIR) M=$(PWD) modules
1),-C $(KDIR)
表示在$(KERNELDIR)目录下执行make命令。
2),M=$(PWD)
表示包含$(PWD)下的Makefile文件。
3),modules
表示模块编译。
4), 用到了ifneq...else...endif语句
由于开始还没定义KERNELRELEASE,所以只能执行else分支。
而在执行
$(MAKE) -C $(KDIR) M=$(PWD) modules
后,会在内核的Makefile中定义KERNELRELEASE,当进入本Makefile时,
则只会执行ifneq的第一个分支,即
obj-m := hello.o
这一句话是非常重要的。事实上,这个Makefile做的本份工作就是它。
我们也可以用命令行的方式来编译:
在Makefile中的内容写为:
obj-m := hello.o
然后在终端敲入:
#make -C /lib/modules/2.6.10/build M=/home/tmp modules
参考文章:
https://blog.csdn.net/bingqing07/article/details/5888875
https://blog.csdn.net/weixin_38391755/article/details/80380786
https://blog.csdn.net/jiankangshiye/article/details/6665179