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

传递参数

传递单个参数

传递数组

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

格式是变量名=变量值

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

相关推荐
且从容.4 小时前
Ubuntu安装flume
linux·ubuntu·flume
承渊政道5 小时前
Linux网络学习【Reactor反应堆模式】
linux·网络·学习·ubuntu·reactor
讯捷蓝达7 小时前
戴尔R720xd服务器卡死在 “Configuring Memory...Done“,换了内存还是卡?问题根本不在内存
运维·服务器
且从容.8 小时前
ubuntu安装flink
linux·ubuntu·flink
数字新视界9 小时前
动环监控信创适配在智能机房管理中的应用价值与未来展望
大数据·服务器·数据库·动环监控系统·动力与环境监控系统
爱和冰阔落9 小时前
【Linux网络】TCP 服务器如何并发处理多个客户端?从 fork、僵尸进程到双重 fork
linux·运维·服务器·网络
程序员沉梦听雨9 小时前
WSL2的安装与使用
linux·wsl
微小的鱼9 小时前
Linux的渲染与显示系统链路
android·java·linux
lisanmengmeng10 小时前
alertmanger 标签 rules 打上分组标签
linux·运维·服务器
Android系统攻城狮10 小时前
Linux FFmpeg深度解析之av_write_frame调用流程与实战(三十三)
linux·运维·服务器·ffmpeg·音视频进阶·ffmpeg音视频