文章目录
- 模块化编程
- 方法一
- 方法二
- 前提
- 模块化编程
- 模块化编程基本框架(重要)
- 模块化编程的编译
- ubantu上操作开发板的文件系统的指令——make
- 超级终端上的模块指令
- 多模块
- 情况1
- 情况2
- 传递参数
- 传递单个参数
- 传递数组
模块化编程
方法一
修改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
传递参数
传递单个参数
传递数组
在加载模块的时候传递参数
格式是变量名=变量值
如果是数组,多个值之间逗号隔开即可