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协议

代码实现如下

c 复制代码
//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语言代码块来复制粘贴(阅读的美观)

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

传递参数

传递单个参数

传递数组

在加载模块的时候传递参数

格式是变量名=变量值

如果是数组,多个值之间逗号隔开即可

相关推荐
什么半岛铁盒3 分钟前
Linux进程异常退出排查指南
linux·运维·服务器
wu~9705 分钟前
计算机网络自定向下:第二章复习
服务器·网络·架构
Mylvzi11 分钟前
Linux 性能利器:详解 `top` 命令的使用与输出信息解析
linux·服务器·网络
Ares-Wang17 分钟前
负载均衡LB》》LVS
运维·负载均衡·lvs
斗转星移331 分钟前
解决ubuntu20.04无法唤醒的问题的一种方法
linux·ubuntu·电脑
大连好光景36 分钟前
沙箱&虚拟化技术&虚拟机&容器之间的关系详解
运维
饺子大魔王的男人1 小时前
Docker环境下FileRise私有云盘在飞牛NAS的部署与穿透实践
运维·docker·容器
lyh13441 小时前
【Ubuntu崩溃修复】
linux·运维·服务器
不爱学英文的码字机器2 小时前
持续交付的进化:从DevOps到AI驱动的IT新动能
运维·人工智能·devops
什么半岛铁盒2 小时前
【Linux系统】Linux环境变量:系统配置的隐形指挥官
linux