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

传递参数

传递单个参数

传递数组

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

格式是变量名=变量值

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

相关推荐
007php0072 小时前
linux服务器上CentOS的yum和Ubuntu包管理工具apt区别与使用实战
linux·运维·服务器·ubuntu·centos·php·ai编程
人类群星闪耀时2 小时前
深度学习在灾难恢复中的作用:智能运维的新时代
运维·人工智能·深度学习
djykkkkkk2 小时前
ubuntu编译遇到的问题
linux·运维·ubuntu
LinkTime_Cloud2 小时前
GitLab 将停止为中国区用户提供服务,60天迁移期如何应对? | LeetTalk Daily
大数据·运维·gitlab
qq_429856573 小时前
linux 查看服务是否开机自启动
linux·运维·服务器
就爱学编程3 小时前
重生之我在异世界学编程之C语言:数据在内存中的存储篇(下)
java·服务器·c语言
Smile丶凉轩3 小时前
Docker核心技术和实现原理
运维·docker·容器
清风细雨_林木木3 小时前
Docker使用——国内Docker的安装办法
运维·docker·容器
运维&陈同学3 小时前
【Kibana01】企业级日志分析系统ELK之Kibana的安装与介绍
运维·后端·elk·elasticsearch·云原生·自动化·kibana·日志收集
7yewh4 小时前
Linux驱动开发 IIC I2C驱动 编写APP访问EEPROM AT24C02
linux·arm开发·驱动开发·嵌入式硬件·嵌入式