Linux内核模块开发

Linux内核模块开发

1. 源代码文件结构

  下面是一个最基本的内核模块源代码结构,任何模块项目都需要包含这些内容

#include <linux/module.h>

/*模块初始化函数*/
static int module_init_func(void) 
{
    return 0;
}

/*模块卸载函数*/
static void module_exit_func(void)
{

}

module_init(module_init_func);
module_exit(module_exit_func);
MODULE_LICENSE("GPL");

2. 常用的头文件

  开发内核模块通常会用到以下头文件

#include <linux/module.h> // 内核模块相关操作,如模块注册,卸载等等
#include <linux/kernel.h> // 内核输入输出等功能函数
#include <linux/fs.h> // 虚拟文件系统相关操作,如打开文件,关闭文件等等
#include <linux/mm.h> // 内存映射相关操作
#include <linux/slab.h> // 内核动态分配,kmalloc/kfree等
#include <linux/vmalloc.h> // 内核动态分配, vmalloc/vfree等
#include <linux/mman.h> // 内存映射相关操作
#include <linux/kallsyms.h> // 查找内核符号表的相关函数 kallsyms_lookup_name
#include <linux/uaccess.h> // 操作用户空间内存的相关函数
#include <linux/err.h>	// 处理Linux错误码的相关函数
#include <linux/types.h> // Linux常用的基本数据类型定义,如uint8_t,size_t等等

3. 编译单个源代码文件的内核模块

  最基本的用于编译一个内核模块的Makefile如下

# 这里设置模块名称,模块名称为源代码文件名去掉后缀名
MODULE_NAME := module_name

# 内核构建系统会根据传递给其的M变量来找到这个Makefile文件并将其include,通过检查KERNELRELEASE变量,可以将传递给内核构建系统的内容和本Makefile单独的操作分开以避免相互影响
ifneq ($(KERNELRELEASE),)

# 此内容传递给内核构建系统,因此只向内核构建系统传递其必须的变量(即obj-m),避免污染内核构建系统中的其他变量
obj-m := $(MODULE_NAME).o

else
# 下面的内容不需要被内核构建系统使用
# 通过ccflags-y变量可以增加编译时的编译参数
ccflags-y := 

# 注意这里传递给内核构建系统的M变量,内核构建系统将在M变量保存的目录中搜索Makefile文件,并将其include
all:
	$(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) ccflags-y=$(ccflags-y) modules

clean:
	$(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) clean
endif

4. 编译多个源代码文件的内核模块

  如果要编译的内核模块包括了多个源代码,需要对Makefile进行一些调整

# 这里设置模块名称(不需要为源代码名称)
MODULE_NAME := module_name

ifneq ($(KERNELRELEASE),)

obj-m := $(MODULE_NAME).o
# 这里写源代码列表,需要将后缀名.c改为.o,以空格分隔
$(MODULE_NAME)-objs := sourcecode1.o sourcecode2.o

else

# 添加额外的编译选项
ccflags-y := 
all:
	$(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) ccflags-y=$(ccflags-y) modules

clean:
	$(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) clean

endif
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值