lv13 内核模块参数和依赖

1 模块传参

1.1 模块参数设置

将指定的全局变量设置成模块参数

module_param(name,type,perm);//将指定的全局变量设置成模块参数
/*
name:全局变量名
type:使用符号      实际类型                传参方式bool         bool           insmod xxx.ko  变量名=0 或 1invbool      bool           insmod xxx.ko  变量名=0 或 1charp        char *         insmod xxx.ko  变量名="字符串内容"short        short          insmod xxx.ko  变量名=数值int          int            insmod xxx.ko  变量名=数值long         long           insmod xxx.ko  变量名=数值ushort       unsigned short insmod xxx.ko  变量名=数值uint         unsigned int   insmod xxx.ko  变量名=数值ulong        unsigned long  insmod xxx.ko  变量名=数值
perm:给对应文件 /sys/module/name/parameters/变量名 指定操作权限#define S_IRWXU 00700#define S_IRUSR 00400#define S_IWUSR 00200#define S_IXUSR 00100#define S_IRWXG 00070#define S_IRGRP 00040#define S_IWGRP 00020#define S_IXGRP 00010#define S_IRWXO 00007#define S_IROTH 00004#define S_IWOTH 00002  //不要用 编译出错#define S_IXOTH 00001
*/module_param_array(name,type,&num,perm);
/*
name、type、perm同module_param,type指数组中元素的类型
&num:存放数组大小变量的地址,可以填NULL(确保传参个数不越界)传参方式 insmod xxx.ko  数组名=元素值0,元素值1,...元素值num-1  
*/

注:perm变量名操作权限一般都设置为0664,对应110(用户可读写),110(组可读写 100,(其他用户可读) 。若是数组变量,存放数组大小变量的地址,可以填NULL(确保传参个数不越界)。

1.2 示例:

testparam.c

#include <linux/module.h>
#include <linux/kernel.h>int gx = 10;               //定义全局变量
char *gstr = "hello";
int garr[5] = {1,2,3,4,5};module_param(gx, int, 0664);  //设置为模块参数
module_param(gstr, charp, 0664);
module_param_array(garr, int, NULL, 0664);int __init testparam_init(void)
{int i = 0;printk("gx=%d\n",gx);printk("gstr=%s\n",gstr);for(i = 0;i < 5;i++){printk("%d ",garr[i]);}printk("\n");return 0;
}void __exit testparam_exit(void)
{printk("testparam will exit\n");
}MODULE_LICENSE("GPL");
//MODULE_AUTHOR("4IOT");
//MODULE_DESCRIPTION("It is only a simple test");
//MODULE_ALIAS("HI");module_init(testparam_init);
module_exit(testparam_exit);

修改MakeFile

ifeq ($(KERNELRELEASE),)ifeq ($(ARCH),arm)
KERNELDIR ?= /home/linux/Linux_4412/kernel/linux-3.14
ROOTFS ?= /opt/4412/rootfs
else
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
endif
PWD := $(shell pwd)modules:$(MAKE) -C $(KERNELDIR) M=$(PWD) modulesmodules_install:$(MAKE) -C $(KERNELDIR) M=$(PWD) modules INSTALL_MOD_PATH=$(ROOTFS) modules_installclean:rm -rf  *.o  *.ko  .*.cmd  *.mod.*  modules.order  Module.symvers   .tmp_versionselse
CONFIG_MODULE_SIG=n
obj-m += testparam.oendif

编译运行

带参数编译运行

用法:用参数控制内核某个功能是否执行 

1.3 参数描述

可用MODULE_PARAM_DESC宏对每个参数进行作用描述,用法:

MODULE_PARM_DESC(变量名,字符串常量);

字符串常量的内容用来描述对应参数的作用

modinfo可查看这些参数的描述信息

2 模块依赖

2.1 模块依赖规则

既然内核模块的代码与其它内核代码共用统一的运行环境,也就是说模块只是存在形式上独立,运行上其实和内核其它源码是一个整体,它们隶属于同一个程序,因此一个模块或内核其它部分源码应该可以使用另一个模块的一些全局特性。

一个模块中这些可以被其它地方使用的名称被称为导出符号,所有导出符号被填在同一个表中这个表被称为符号表。

最常用的可导出全局特性为全局变量和函数

查看符号表的命令:nm nm查看elf格式的可执行文件或目标文件中包含的符号表,用法:

nm 文件名 (可以通过man nm查看一些字母含义)

第一列:其相对地址(即相对位置)

D代表全局变量(初始化过的)

T代表函数

B代表全局变量 (未被初始化)

R代表加了const的全局变量

两个用于导出模块中符号名称的宏:

EXPORT_SYMBOL(函数名或全局变量名)EXPORT_SYMBOL_GPL(函数名或全局变量名) 需要GPL许可证协议验证

使用导出符号的地方,需要对这些符号进行extern声明后才能使用这些符号

B模块使用了A模块导出的符号,此时称B模块依赖于A模块,则:

  1. 编译次序:先编译模块A,再编译模块B,当两个模块源码在不同目录时,需要:i. 先编译导出符号的模块A ii. 拷贝A模块目录中的Module.symvers到B模块目录 iii. 编译使用符号的模块B。否则编译B模块时有符号未定义错误

  2. 加载次序:先插入A模块,再插入B模块,否则B模块插入失败

  3. 卸载次序:先卸载B模块,在卸载A模块,否则A模块卸载失败

补充说明: 内核符号表(直接当文本文件查看)

 /proc/kallsyms运行时 /boot/System.map编译后

 查看

vi /proc/kallsyms  //运行起来就没有相对地址了,给绝对地址也不安全所以都是0
vi /boot/System.map

 

 

 

开发板查看符号表

vim vmlinux

 

2.2 示例(2个模块同目录下):

moduleA.c

#include <linux/module.h>
#include <linux/kernel.h>int gx = 19;EXPORT_SYMBOL(gx);int __init moduleA_init(void)
{printk("In module_a init gx=%d\n",gx);return 0;
}void __exit moduleA_exit(void)
{printk("moduleA will exit\n");
}//MODULE_AUTHOR("4IOT");
//MODULE_DESCRIPTION("It is only a simple test");
//MODULE_ALIAS("HI");module_init(moduleA_init);
module_exit(moduleA_exit);

moduleB.c

#include <linux/kernel.h>extern int gx;int __init moduleB_init(void)
{printk("\n");return 0;
}void __exit moduleB_exit(void)
{printk("moduleB will exit\n");
}MODULE_LICENSE("GPL");
//MODULE_AUTHOR("4IOT");
//MODULE_DESCRIPTION("It is only a simple test");
//MODULE_ALIAS("HI");module_init(moduleB_init);
module_exit(moduleB_exit);

MakeFile(注意编译顺序)

ifeq ($(KERNELRELEASE),)ifeq ($(ARCH),arm)
KERNELDIR ?= /home/linux/Linux_4412/kernel/linux-3.14
ROOTFS ?= /opt/4412/rootfs
else
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
endif
PWD := $(shell pwd)modules:$(MAKE) -C $(KERNELDIR) M=$(PWD) modulesmodules_install:$(MAKE) -C $(KERNELDIR) M=$(PWD) modules INSTALL_MOD_PATH=$(ROOTFS) modules_installclean:rm -rf  *.o  *.ko  .*.cmd  *.mod.*  modules.order  Module.symvers   .tmp_versionselse
CONFIG_MODULE_SIG=n
obj-m += moduleA.o   //需要先编译moduleA
obj-m += moduleB.oendif

编译

插入模块(注意插入顺序)

移除模块(注意移除顺序)

2.3 示例(2个模块不同目录)

新建两个目录moda、modb

分别把之前示例的.c和Makefile放到moda和modb目录下 

修改Makefile只编译目录下的可执行文件。

编译的时候必须先编译A,否则会报错,如下图。编译完A后需要把生成的.symvers文件拷贝到B再再编译B。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/824084.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

听GPT 讲Rust源代码--src/tools(39)

File: rust/src/tools/rustfmt/src/config/config_type.rs 在Rust代码中&#xff0c;rust/src/tools/rustfmt/src/config/config_type.rs文件的作用是定义了与配置相关的数据结构和函数。 Config struct&#xff08;配置结构体&#xff09;&#xff1a;该结构体用于存储rustfmt…

虚拟化技术和云计算的关系

1、云计算底层就是虚拟化技术。 &#xff08;1&#xff09;常见的虚拟化技术&#xff1a;VMware&#xff08;闭源的&#xff0c;需要收费&#xff09;、XEN、KVM &#xff08;2&#xff09;大部分公司用的虚拟化方案&#xff1a;XEN、KVM 2、虚拟化的历史 &#xff08;1&am…

自然语言处理3——玩转文本分类 - Python NLP高级应用

目录 写在开头1. 文本分类的背后原理和应用场景1.1 文本分类的原理1.2 文本分类的应用场景 2. 使用机器学习模型进行文本分类&#xff08;朴素贝叶斯、支持向量机等&#xff09;2.1 朴素贝叶斯2.1.1 基本原理2.1.2 数学公式2.1.3 一般步骤2.1.4 简单python代码实现 2.2 支持向量…

django基础学习

django基础学习 文章目录 django基础学习django框架urls.py将请求发送到正确的视图views.py处理请求models.py定义数据模型根据models查询数据HTML模板呈现数据 Django项目结构创建虚拟环境下载django创建站点创建应用settings.py项目设置 通用类别视图会话框架身份验证视图使用…

MySQL数据库的安装与环境配置

下载 下载MySQL8 安装 解压 配置MySQL环境变量 系统环境变量path D:\ProgramFiles\mysql-8.0.20-winx64\bin 1.点击属性 2.点击高级系统设置 3.点击环境变量 4.在系统变量中找到path 注意这里不是用户变量 5.新建后输入解压的地址 MySQL初始化和启动 以管理员身份运行cmd…

TOGAF架构开发方法

TOGAF针对架构开发方法定义了一系列阶段和步骤&#xff0c;这些阶段和步骤对架构的迭代过程进行了详细、标准的描述。 企业架构的项目过程 一、预备阶段&#xff08;Preliminary&#xff09; 1、目标 预备阶段的目标是&#xff1a; 对组织的背景和环境进行审查&#xff08;调…

css实现一个斑马条纹动画,实现一个理发店门口的小转转,进度条动画同理!

css实现一个斑马条纹动画&#xff0c;实现一个理发店门口的小转转 前置基础知识 css背景background的重复渐变属性repeating-linear-gradient() 该属性类似于linear-gradient(),但他会在整个方向上重复渐变以覆盖整个容器 一、先写一个普通渐变例子linear-gradient() &…

数据库的学习笔记——第一篇

SQL通用语法 SQL语句 DDL 数据定义 数据库、表字段 DML 数据操作 增删改 DQL 数据查询 查询表中记录 DCL 数据控制 创建用户、控制用户权限 DLL语句——数据库操作 SHOW DATABASES; # 查询数据库SELECT DATABASE(); # 查询当前数据库CREATE DATABASE [IF …

Cuk、Zeta和Sepic开关电源拓扑结构

Cuk、Zeta和Sepic变换器,三种拓扑结构大致类似。不同点在于电感和二极管&#xff0c;MOS管的位置关系的变化。 Cuk电源是一种非隔离的直流电源转换器&#xff0c;其基本结构包括输入滤波电容、开关管、输入电感、输出电感和输出电容等元件。Cuk电路可以看作是Boost和Buck电路的…

万物简单AIoT物联网平台快速开始

学物联网&#xff0c;来万物简单IoT物联网&#xff01;&#xff01; 万物简单AIoT物联网提供一站式的AI物联网的学习平台&#xff0c;以及物联网SaaS私有化部署的解决方案。从终端硬件系统、云平台到APP前端的物联网能力&#xff0c;助力企业和开发者的设备具备1分钟快速上云的…

用 Node.js 写一个爬虫

自己设计一个网站&#xff0c;然后去爬取别人家页面的数据来做一个自己的网站。哈哈哈&#xff0c;如果自己写着玩可能没啥事&#xff0c;但如果用这个网站来获利&#xff0c;你可能就要被寄律师函了&#xff0c;毕竟这有点‘刑’。这篇文章呢&#xff0c;就带大家爬取豆瓣TOP2…

Android APK未签名提醒

最近新建了一个项目&#xff0c;在build.gradle中配置好了签名&#xff0c;在执行打包的时候打出的包显示已签名&#xff0c;但是在上传市场的时候提示未签名。于是排查了好久&#xff0c;发现在build.gradle中配置的minsdk 24&#xff0c;会导致不使用V1签名&#xff0c;于是我…

用 Unity 实现的安检模拟小游戏源码,通过安检设备 (扫描仪) 检查乘客的随身物品 根据禁止名单对乘客做出判断是否允许通行

介绍 用 Unity 实现的安检模拟小游戏 软件版本 Unity 2019.4.9f1 (64-bit) Visual Studio 2019 游戏玩法 在游戏中你将扮演一名安全检查员 通过安检设备 (扫描仪) 检查每位乘客的随身物品 根据禁止名单对乘客做出判断&#xff1a;允许通行或者下令逮捕 游戏效果 游戏截图…

十三:爬虫-Scrapy框架(下)

一&#xff1a;各文件的使用回顾 1.items的使用 items 文件主要用于定义储存爬取到的数据的数据结构&#xff0c;方便在爬虫和 Item Pipeline 之间传递数据。 items.pyimport scrapyclass TencentItem(scrapy.Item):# define the fields for your item here like:title scr…

video数据的维度及维度变形

B*C*D*H*W的值并不是指输入模型的样本的总大小&#xff0c;它仅仅代表着输入模型的video数据的属性&#xff08;形状&#xff09;。 reshape 在reshape时&#xff0c;出现的报错“cant reshape of size input”之类的&#xff0c;是指&#xff1a;那些数据没法组成规定的形状…

vivado CDC约束-“设置总线倾斜”对话框

“设置总线倾斜”对话框 在AMD Vivado™ IDE中&#xff0c;可以通过多种方式设置总线偏斜约束&#xff1a; •通过时间约束编辑器。选择窗口 → 时间限制 → 断言 → 设置总线倾斜。从“时序约束编辑器”中&#xff0c;可以添加、删除或修改总线扭曲约束。 注意&#…

【Transformer】深入理解Transformer模型1——初步认识了解

前言 Transformer模型出自论文&#xff1a;《Attention is All You Need》 2017年 近年来&#xff0c;在自然语言处理领域和图像处理领域&#xff0c;Transformer模型都受到了极为广泛的关注&#xff0c;很多模型中都用到了Transformer或者是Transformer模型的变体&#xff0…

【分布式配置中心】聊聊Apollo的安装与具体配置变更的原理

【管理设计篇】聊聊分布式配置中心 之前就写过一篇文章&#xff0c;介绍配置中心&#xff0c;但是也只是简单描述了下配置中心的设计点。本篇从apollo的安装到部署架构到核心原理进一步解读&#xff0c;大概看了下apollo的原理&#xff0c;感觉没有必要深究&#xff0c;所以就…

SSM房屋租赁系统----计算机毕业设计

项目介绍 房屋租赁系统&#xff0c;基于 Spring5.x 的实战项目&#xff0c;此项目非Maven项目。 前台系统主要功能包括房源列表展示、房源详细信息展示、根据房源特征进行搜索&#xff0c;包括&#xff1a;房型、小区名;以及房源的预订功能。 后台管理&#xff1a; 用户信息管…

秒杀系统的设计思路(应对高并发,超卖等问题的解决思路)

首先我们先看一下设计秒杀系统时&#xff0c;我们应该考虑的问题。 解决方案&#xff1a; 一.页面静态化结合CDN内容分发 前端把能提前放入cdn服务器的东西都放进去&#xff0c;反正把所有能提升效率的步骤都做一下&#xff0c;减少真正秒杀时候服务器的压力。 秒杀活动的页面…