Linux驱动——模块化编程

模块化编程

方法一

修改kconfig,make menucofig,Makefile,编译进内核,启动的时候会自动加载,关机的时候自动卸载,
1.进入Linux3.5内核下的文件系统,make menucofig可选菜单,该路径下的Kconfig其实就是菜单的代码,编辑菜单
2.内核裁剪和添加make menuconfig
打开图形化界面——可以将一些配置选择为*或者空或者为M
空:不选择
*:选择,直接编译进内核
M:选择,编译成模块,需要用户手动加载
3.内核源码路径下的Kconfig文件是来配置make menuconfig的菜单选项的。
可以使用的类型:bool 真假
选择/不选择 */空格
tristate 三态类型 真 假 模块
选择/不选择/编译为模块
/空格/M
在make menuconfig配置完成之后,会被保存在一个.config文件里边
选择为
的,会被写成xxx = y
选择为M的,会被写成xxx = m
选择为空格的,会被注释掉
接下来内核的编译就是根据.config文件进行的。
make的时候,会依次去查找路径下的makefile文件,进行编译,根据.config里边的配置去决定使用哪个文件参与编译。
在添加新的选项的时候,需要更改kconfig文件,还需要更改和Kconfig同一级目录下的Makefile文件。
具体不再截图实现,主要使用方式二

方法二

将驱动代码写成模块,使用的时候手动加载,不使用的时候手动卸载

前提

安装在windows下,使用这个软件来新建工程—》将linux3.5内核源代码添加到工程里边—》可以在该工程里边写代码
在windows下的sourceinsight软件里边写代码
在ubuntu下的linux3.5源码路径下编译代码
将代码移动到根文件系统路径下
在开发板端运行代码。

新建工程,导入linux3.5源码文件
准备工作:安装好source insight
在windows下解压linux3.5内核源代码

模块化编程

工程的创建及source insight的下载请参考博文https://blog.csdn.net/whhcsdn233/article/details/132545683?spm=1001.2014.3001.5501

模块化编程基本框架(重要)

1. 头文件包含
#include “linux/module.h”
#include “linux/kernel.h”
2. 编写模块的加载函数
有返回值 __init 函数名随便写 没有参数
函数必须被 __init修饰(两个下划线)
加载函数是在驱动被添加的时候自动执行的函数
3. 编写模块的卸载函数
无返回值 __exit 函数名随便写 没有参数
函数必须被 __ exit修饰(两个下划线)
卸载函数是在驱动被卸载/删除的时候自动调用的
4. 声明加载函数
module_init(加载函数名称)
5. 声明卸载函数
module_exit(卸载函数名称)
6. 声明遵循GPL协议
代码实现如下

//1.包含头文件
#include <linux/module.h>
#include <linux/kernel.h>

//2.编写加载函数
int __init first_module_init(void)
{
	printk("first_module_init is called\n");
	return 0;
}
//3.编写卸载函数
void __exit first_module_exit(void)
{
	printk("first_module_exit is called\n");
}

//4.声明加载函数
module_init(first_module_init);
//5.声明卸载函数
module_exit(first_module_exit);
//6.声明遵循的协议
MODULE_LICENSE("GPL");

模块化编程的编译

模块编译:将.c代码编译成.ko文件
必须借助linux3.5内核源代码
需要一个makefile文件//注释:makedown软件没有makefile的代码块,这里用c语言代码块来复制粘贴(阅读的美观)

obj-m += led.o	#xxx.c这里需要改为xxx.o

KDIR:=/root/test/第三天/linux-3.5
				#linux-3.5内核的位置
all:
	make -C $(KDIR) M=$(PWD) modules
	#不是执行此Makefile
	#他是去将此文件 led.o拿到 内核的位置
	#用内核的Makefile将此文件编译生成内核的驱动模块
	#而且将此模块放到了当前路径
clean:
	rm -f *.ko *.o *.mod.o *.mod.c *.symvers *.markers *.order

ubantu上操作开发板的文件系统的指令——make

在这里插入图片描述

超级终端上的模块指令

加载模块:insmod
卸载模块:rmmod
查看模块:lsmod

在这里插入图片描述

多模块

多模块下需要注意以下几点

情况1

情况1:
多个独立的模块,模块之间的代码存在依赖关系
被调用模块里边,需要使用EXPORT_SYMBOL声明该函数可以被外部调用
需要调用模块里边,需要声明函数来自外部
在加载的时候,需要先加载被调用的模块
卸载的时候,先卸载调用模块
模块1使用模块2代码

情况2

情况2:
多个文件生成一个模块—》只有一个模块文件,其他的就是普通的功能文件
多个文件生成一个模块,只有一个文件里边是模块的框架,其余的是被使用的函数
编译的时候,需要修改makefile

传递参数

传递单个参数

在这里插入图片描述

传递数组

在这里插入图片描述
在加载模块的时候传递参数
格式是变量名=变量值
如果是数组,多个值之间逗号隔开即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值