linux设备驱动开发详解

第四章 linux内核模块
1.linux内核模块的优点
1)模块可以不用编译linux内核,在开发调试的时候,通过动态加载命令加载进内核就可以运行,大大提升了开发调试效率,同时也控制了linux内核的大小
2)模块一旦被加载,它就和linux内核其他的部分一样,直接运行。
2.linux内核模块基本结构
linux内核包含主要的几个基本功能函数和声明函数,具体如下:
module_init()是模块的初始化(即加载)接口声明函数,通过传入自己编写的设备初始化接口,对模块进行初始化。
module_exit()是模块的退出(即卸载)函数声明函数,通过传入自己编写的设备退出接口,退出模块。
module_param()是模块参数声明函数,对模块的运行需要的参数进行声明。
MODULE_AUTHOR()是模块作者声明函数,传入字符串声明模块的编写者是谁
MODULE_LICENSE()模块许可声明函数,声明描述内核模块的许可权限,如果不声明,模块被加载的时候会被内核报内核污染错误。可接受的内核许可权限有:“GPL”,“GPL v2”,“GPL and additional rights”,“Dual BSD/GPL”,“Dual MPL/GPL”,“Proprietary”.
MODULE_DESCRIPTION()是模块功能描述函数,传入描述模块功能的字符串
MODULE_VERSION()是模块版本设置函数
3.模块编程实例
下面这个模块是传入两个参数的模块,里面是对两个参数进行打印,具体代码实现如下:

#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");

static char *book_name = "dissecting Linux Device Driver";
static int num = 4000;

static int book_init(void)
{
	printk(KERN_INFO "book init \n");
	printk(KERN_INFO "book name :%s\n", book_name);
	printk(KERN_INFO "book_num: %d\n", num);
	return 0;
}

static void book_exit(void)
{
	printk(KERN_INFO "book exit! \n");
}

module_init(book_init);
module_exit(book_exit);
module_param(num, int, S_IRUGO);
module_param(book_name, charp, S_IRUGO);

MODULE_AUTHOR("Barry song <21cnbao@gmail.com>");
MODULE_DESCRIPTION("A simple Module for testing module params");
MODULE_VERSION("v1.0");

其中,代码中的printk函数和printf函数的功能相同,输出日志信息到命令行, 可以在linux终端使用dmesg进行查看,在使用printk函数的时候,需要传入对应的日志输出等级。

4.模块编译对应的makefile
首先,由于现在的模块是在嵌入式开发板上运行的,所以在对模块源代码进行make编译之前,要先配置模块编译环境,安装模块编译工具链,同时也要安装开发板上运行的模块内核代码,并对代码进行安装和编译以后,才能完成对应的代码编译,具体的makefile代码如下:

ifeq ($(KERNELRELEASE),)

CONFIG_MODULE_SIG=N

ifeq ($(ARCH), arm)
	KERNELDIR ?= /home/liuniu/fs-mp1a/linux/fsmp1a-linux-5.4.31
else
	KERNELDIR ?= /lib/modules/$(shell uname -r)/build
endif

PWD := $(shell pwd)

modules:
	$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
clean:
	rm -rf *.o *.ko .*.cmd *.mod.* modules.order Module.symvers .tmp_version    s

else

obj-m := test_param.o

endif

其中 CONFIG_MODULE_SIG=N 命令是申请模块签名的一个配置
/home/liuniu/fs-mp1a/linux/fsmp1a-linux-5.4.31路径是开发板源码在我的虚拟机上的安装路径
模块源码编译的时候,使用的编译命令是:make ARCH=arm进行编译。编译完成以后生成.ko文件,拷贝到开发板上进行加载测试。
5.模块安装和卸载命令
1)安装模块命令:
insmod test_param.ko book_name=‘liuniu’ num=5000
2)卸载命令:
rmmod test_param.ko

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值