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

传递参数

传递单个参数

传递数组

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

格式是变量名=变量值

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

相关推荐
一个响当当的名号几秒前
ASP.NET 期末突击
运维·服务器
秋深枫叶红5 分钟前
嵌入式第三十五篇——linux系统编程——exec族函数
linux·前端·学习
@Wufan7 分钟前
ubuntu服务器子用户(无sudo权限)安装/切换多个版本cuda
linux·服务器·ubuntu·cuda
studytosky10 分钟前
Linux 基础开发工具(3):Git 控制与 GDB 调试实用指南
linux·运维·服务器·网络·数据库·git
吕了了15 分钟前
给U盘一个PE to Go:将微PE系统直接释放到U盘
运维·windows·电脑·系统
pblh12319 分钟前
基于Docker部署测试PySpark
运维·docker·容器
飞翔沫沫情21 分钟前
vmware Esxi6.7 root密码重置
运维
良策金宝AI32 分钟前
全球工程软件格局重塑:中国AI原生平台的机会窗口
大数据·运维·人工智能
yBmZlQzJ36 分钟前
财运到内网穿透-群晖NAS安装(docker版本)
运维·经验分享·网络协议·docker·容器
WG_171 小时前
Linux:环境变量
linux·运维·服务器