linux驱动入门——驱动模块概述

最近在学习linux驱动的知识,虽然也写了个简单地led驱动,但整个驱动模块的概念还是很模糊,这篇博客就结合郑强老师的《linux驱动开发入门与实践》来梳理一下驱动模块的框架、体系。
声明:入门阶段以使用目的为主,并不过多涉及内核。

一、驱动模块的组成

如图所示,一个驱动模块由头文件、模块参数、模块功能函数、模块加载函数、模块卸载函数、模块许可声明组成,其中头文件、模块加载函数、模块卸载函数、模块许可声明是必须要有的。
在这里插入图片描述
这里来结合具体的一个具体驱动模块来说明:

#include <linux/init.h>				//头文件
#include <linux/module.h>
static int hello_init(void)			//模块加载函数
{
	printk(KERN_ALERT"Hello, World\n");
	return 0;
}
static void hello_exit(void)		//模块卸载函数
{
	printk(KERN_ALERT"Goodbye,World\n");
}
module_init(hello_init);			//注册模块加载函数
module_exit(hello_exit);			//注册模块卸载函数
MODULE_LICENSE("Dual BSD/GPL");		//模块许可声明

这个模块里值包含了必要项,即头文件、模块加载函数、模块卸载函数、模块许可声明,它的功能就是被加载时打印“Hello ,World”,被卸载时打印“Goodbye ,World”。
module_init()和module_exit()是两个宏,分别用来向内核声明模块的加载和卸载。当使用insmod命令来加载模块时会进入模块调用入口即hello_init函数,当使用rmmod来卸载模块时将调用hello_exit函数。
模块许可声明表示模块受内核支持的程度,需要使用MODULE_LICENSE表示该模块的许可权限。

二、编译模块

一般使用makefile来编译模块,例如hello模块的编译如下

ifeq ($(KERNELRELEASE),)
	KERNELDIR  ?= /linux-2.6.34.14/linux-2.6.34.14
	PWD :=$(shell pwd)
modules:
	$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
modules_install:
	$(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
clean:
	rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions
else
	obj-m := hello.o
endif

这段代码涉及makefile和shell脚本的编写,这里不过多解释。编译的结果是生成一个hello.ko的模块文件。

三、模块操作

insmod:加载模块
rmmod:卸载模块
lsmod:列出已经加载的模块和信息
modinfo:查询模块的相关信息,如作者、版权等

四、文件系统变化

在加载了一个模块之后,linux的文件系统会发生一些改变,若使用insmod hello.ko加载了hello.ko模块,则可以在/proc/modules文件下查看该模块的具体信息,实际上lsmod命令就是从该文件中读取信息的;若新建了设备,则在/proc/devices文件中可以看到新建的设备文件(此处没有新建)。
有关/proc目录的说明,可以参考(https://www.cnblogs.com/DswCnblog/p/5780389.html)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值