2019-07-18 | UNLOCK

2019-7-18-内核模块helloworld编写

内核模块helloworld编译

环境:Ubuntu14虚拟机

内核模块编译流程

内核模块编译过程

内核模块编译流程:

第一步:调用Linux源码树的makefile进行收集一个模块所需的信息

第二步:Linux源码树的makefile在收集完信息后,调用模块的makefile,获取需要编译的模块.c文件,最后生成内核模块

所以编译一个内核模块,需要写c程序和makefile文件

编写c程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<linux/init.h>
#include<linux/module.h>

MODULE_LICENSE("GPL");//开源协议GPL

static int hello_init(void){
printk(KERN_ALERT"Hello,linux module!\n");
//printk就是内核的printf,默认日志级别为4,只有权限不小于终端日志级别的时候才能输出(数字越小权限越高)
//日志级别一共有8个,控制台级别可以cat /proc/sys/kernel/printk查看
//显示四个参数分别控制台日志级别、printk默认日志级别、控制台可调节最低级别、控制台可调节最高级别
return 0;
}

static void hello_exit(void){
printk(KERN_ALERT"Hello,linux module exit!\n");
return 0;
}

module_init(hello_init);//模块入口,完成模块加载
module_exit(hello_exit);//模块出口,完成模块卸载,释放资源

编写makefile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#KERNELRELEASE:在内核源码树的makefile中定义,在当前的makefile中值为空
#$(shell uname -r):获取当前系统的linux内核版本
#KERNEL_DIR:指定当前linux操作系统源代码路劲
#一般出现Makefile missing separator. Stop就是格式错误,比如:
#makefile文件要注意用tab缩进,不能用空格
#函数后面要加空格,比如ifeq
$(info "call hello makefile")
ifeq ($(KERNELRELEASE),)
#ifeq就是判断是否相等,这里就是判断KERNELRELEASE是否等于空值,等于则返回true
KERNEL_DIR ?=/lib/modules/$(shell uname -r)/build
#KERNEL_DIR是系统的源码树,为了让模块在linux中运行,就需要用当前linux的源码树中的makefile文件make
PWD :=$(shell pwd)

modules:
$(MAKE) -C $(KERNEL_DIR) M=$(PWD) modules

.PHONY:modules clean
clean:
$(MAKE) -C $(KERNEL_DIR) M=$(PWD) clean

else
obj-m := hello.o
endif

内核模块演示

可以看到我们编写的makefile文件被调用了三次:

第一次:调用makefile文件,因为KERNELRELEAS为控制,所以调用源码树的makefile。

第二次:因为这次makefile文件是被Linux内核源码树的顶层makefile调用,变量KERNELRELEAS已经不为空了,所以编译hello.c文件,产生hello.o文件。

第三次:被Linux内核源码树的顶层makefile调用,根据.o文件生成.ko模块文件。

模块的使用

1、加载模块:insmod *.ko

sudo insmod hello.ko

2、查看系统中加载的模块: lsmod

sudo lsmod|grep hello

3、卸载模块:rmmod *.ko

sudo rmmod hello

4、查看printk打印的信息 dmesg 或 dmeg|tail(dmesg是从linux内核的ring buffer 中读取信息的,而printk打印的信息都会送到ring buffer中)

内核模块结果

最后结果如上图,hello模块成功运行。

本篇参考:http://blog.chinaunix.net/uid-26833883-id-4366882.html

makefile报错解决:https://bbs.csdn.net/topics/390344596

评论加载中