2、模块传参和依赖

news2024/11/24 13:33:36

一、模块传参

使用函数 module_param(name,type,perm);

  • 将指定的全局变量设置成模块参数
/*
name:全局变量名
type:
    使用符号      实际类型                传参方式
	bool	     bool           insmod xxx.ko  变量名=0 或 1
	invbool      bool           insmod xxx.ko  变量名=0 或 1
	charp        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/变量名 指定操作权限(一般为0664)
	#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
*/

示例

  • 1、定义全局变量
  • 在这里插入图片描述
  • 2、使用函数将全局变量设置为模块参数
  • 在这里插入图片描述

参数为数组 module_param_array(name,type,&num,perm);

/*
name、type、perm同module_param,type指数组中元素的类型
&num:存放数组大小变量的地址,可以填NULL(确保传参个数不越界)
    传参方式 insmod xxx.ko  数组名=元素值0,元素值1,...元素值num-1  
*/

示例

  • 1、定义全局变量

  • 在这里插入图片描述

  • 2、使用函数将全局变量设置为模块参数

  • 在这里插入图片描述

查看结果

  • 1、编译之后安装模块
    在这里插入图片描述
  • 2、在Ubuntu日志中查看打印信息 dmesg
    在这里插入图片描述
  • 3、安装模块时传参
    在这里插入图片描述

对参数进行描述

MODULE_PARM_DESC(变量名,字符串常量);
字符串常量的内容用来描述对应参数的作用

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

二、模块之间的依赖

模块的代码与其他内核代码公用统一的运行环境,也就是模块是在存在形式上独立,运行上其实和其他内核模块是一个整体,属于同一个程序。因此一个模块或者内核其他部分源码可以使用另一个模块的全局特性。

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

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

查看符号表的命令:nm

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

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

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

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

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

  • 1、编译次序:先编译A模块,在编译B模块。
    • 当两个模块处于不同的目录时:
      • ①、先编译导出符号的A模块
      • ②、拷贝A模块目录中的Modules.symvers到B模块目录中
      • ③、编译使用符号的B模块
      • 否则编译B模块时会有未定义错误
  • 2、加载次序:先插入A模块,再插入B模块,否则插入失败
  • 3、卸载持续:先写在B模块,在写在A模块,否则卸载失败

三、内核空间和用户空间

为了彻底解决一个应用程序出错不影响系统和其他app运行,操作系统给每个app分配了一个独立的假象地址空间,这个假象的空间被称为虚拟地址空间(也叫逻辑地址),操作系统也占用其中的一部分。32为Linux的虚拟地址空间大小为4G,并将其划分为两部分:

  • 1、0 - 3G用户空间:每个应用程序只能使用自己的虚拟地址空间
  • 2、3 - 4G内核空间:内核使用的虚拟地址空间,应用程序不能直接使用这份地址空间,但可以通过一些系统调用函数与其中某些空间进行数据通信。

实际内存操作时,需要将虚拟地址映射到实际内存的物理地址,然后才能进行实际的内存读写

四、执行流

执行流:有开始有结束总体顺序执行的一段独立代码,又被称为代码上下文
执行流分类:

  • 1、任务流–任务上下文(都参与CPU时间片轮询,都有任务五状态:就绪态、运行态、僵尸态、暂停态、睡眠态)
    • 1)、进程
    • 2)、线程
      • ①、内核线程:内核创建的线程
      • ②、应用线程:应用进程创建的线程
  • 2、异常流–异常上下文:
    • 1)、中断
    • 2)其他异常

应用编程可能涉及到的执行流:

  • 1、进程
  • 2、线程

内核编程可能涉及到的执行流:

  • 1、应用程序自身代码运行在用户空间,处于用户态-------------用户态app
  • 2、应用程序正在调用系统调用函数,运行在内核空间,处于内核态。即代码是内核代码但处于应用执行流(属于一个应用的线程或进程)-------------内核app
  • 3、一直运行于内核空间,处于内核态,属于内核任务的上下文-------------内核线程
  • 4、一直运行于内核空间,处于内核态,专门用来处理各种异常-------------异常上下文

模块编程与应用编程的比较

不同点内核模块应用程序
API来源不能使用任何库函数各种库函数均可以使用
运行空间内核空间用户空间
运行权限特权模式运行非特权模式运行
编译方式静态编译进内核镜像或编译特殊的ko文件elf格式的应用程序可执行文件
运行方式模块中的函数在需要时被动调用从main开始顺序执行
入口函数init_modulemain
退出方式cleanup_modulemain函数返回或调用exit
浮点支持一般不涉及浮点运算,因此printk不支持浮点数据支持浮点运算,printf可以打印浮点数据
并发考虑需要考虑多种执行流并发的竞态情况只需考虑多任务并行的竞态
程序出错可能会导致整个系统崩溃只会让自己崩溃

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

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

相关文章

运营商sdwan优缺点及sdwan服务商优势

SD-WAN(软件定义广域网)作为一种重要的网络解决方案,已经受到了广泛的关注和采用。然而, 无论是由传统运营商提供的SD-WAN还是专门的SD-WAN服务提供商,都存在各自的优缺点。 运营商提供的SD-WAN的缺点: 1. 有限的灵活性&#xf…

数据库查询详解

数据库查询操作 前置:首先我们创建一个练习的数据库 /* SQLyog Professional v12.09 (64 bit) MySQL - 5.6.40-log : Database - studentsys ********************************************************************* *//*!40101 SET NAMES utf8 */;/*!40101 SET …

【uniapp】自定义导航栏时,设置安全距离,适配不同机型

1、在pages.json中,给对应的页面设置自定义导航栏样式 {"path": "pages/index/index","style": {"navigationStyle": "custom","navigationBarTextStyle": "white","navigationBarTitl…

智慧电力物联网系统引领电力行业数字化发展

智慧电力物联网系统是以提高用户侧电力运行安全、降低运维成本为目的的一套电力运维管理系统。综合分析采用智慧物联网、人工智能等现代化经济信息网络技术,配置智能采集终端、小安神童值班机器人或边缘网关,实现对企事业用户供配电系统的数字化远程监控…

网关、网桥、路由器和交换机之【李逵与李鬼】

概念 网关 网关简单来说是连接两个网络的设备,现在很多局域网都是采用路由器来接入网络,因此现在网关通常指的就是路由器的IP。网关可用于家庭或者小型企业,连接局域网和Internet,也有用于工业应用的。 网桥 网桥也叫桥接器,是连接两个局域网的一种存储/转发设备,它能…

Python字符串处理:掌握文本的艺术

更多资料获取 🤓 作者主页:涛哥聊Python 📚 个人网站:涛哥聊Python 在Python编程中,字符串是一种不可或缺的数据类型,用于表示文本和字符数据。本文将深入探讨Python字符串的各个方面,从基础概…

网络安全(黑客技术)—小白自学笔记

1.网络安全是什么 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一、是市场需求量高; 二、则是发展相对成熟入…

缓冲流 java

字节缓冲池的默认大小 (8192/byte)字节输入输出流 字节缓冲输入接口也是 InputStream 读字节 实现类BufferedInputStream 字节缓冲输出接口也是 OutputStream 写字节 实现类BufferedOutputStream package BufferFlow;import CopysIO.Myconnectio…

vue-next-admin本地部署

开源地址 文档 本次学习的代码地址https://gitee.com/lyt-top/vue-next-admin/tree/vue-next-admin-nest/,这个做了前后端分离方便学习 部署 下载代码,解压 后台 创建数据库 CREATE DATABASE vuenextadmin01 CHARACTER SET utf8 COLLATE utf8_bin;…

25 mysql like 是否使用索引

前言 这里主要是 探究一下 explain $sql 中各个 type 诸如 const, ref, range, index, all 的查询的影响, 以及一个初步的效率的判断 这里会调试源码来看一下 各个类型的查询 需要 lookUp 的记录 以及 相关的差异 此系列文章建议从 mysql const 查询 开始看 测试表结构…

大文件上传,前端vue 做分片上传

html – 以弹窗的形式 <!-- 上传算法文件 --> <el-dialog title"上传算法文件" :visible.sync"uploadPop" width"60%" :close-on-click-modal"false" :before-close"closeUploadPop" append-to-body custom-class…

完美收官丨深圳信驰达科技IOTE 2023第二十届国际物联网展参展回顾

►►►展会风采 2023年9月22日&#xff0c;为期三天的IOTE 2023第二十届国际物联网展 • 深圳站在深圳国际会展中心&#xff08;宝安馆&#xff09;9、10、11号馆圆满落幕。本届展会以“IoT构建数字经济底座”为主题&#xff0c;吸引覆盖IoT全栈生态的参展商&#xff0c;展出超…

【数据结构】快排的详细讲解

目录&#xff1a; 介绍 一&#xff0c;递归快排确定基准值 二&#xff0c;递归遍历 三&#xff0c;非递归的快排 四&#xff0c;快排的效率 介绍 快排是排序算法中效率是比较高的&#xff0c;快排的基本思想是运用二分思想&#xff0c;与二叉树的前序遍历类似&#xff0c;…

C++ 之如何将数组传递给函数?

在本文中&#xff0c;您将学习将数组传递给C 中的函数。您将学习如何传递一维和多维数组。 数组可以作为参数传递给函数。也可以从函数返回数组。考虑以下示例&#xff0c;将一维数组传递给函数&#xff1a; 示例1&#xff1a;将一维数组传递给函数 C 程序通过将一维数组传递…

从事嵌入式工作有哪些优势?

随着物联网和人工智能的发展&#xff0c;嵌入式技术越来越值钱&#xff0c;学嵌入式的人也越来越多&#xff0c;现在开始入行嵌入式。根据一些权威部门统计&#xff0c;我国目前嵌入式软件人才缺口每年为40万人左右&#xff0c;嵌入式人才供给一直处于供不应求的状态。 那么从…

Docker私有仓库打开2375端口(linux)

前言 在我们开发测试过程中&#xff0c;需要频繁的更新docker镜像&#xff0c;然而默认情况下&#xff0c;docker的2375端口是关闭的&#xff0c;下面介绍如何打开端口。 1、打开步骤 1.1、修改配置 登录docker所在服务器&#xff0c;修改docker.service文件 vi /usr/lib/sys…

Mac解压缩软件BetterZip免费版注册码下载

软件介绍 BetterZip免费版是一款适用于Mac系统的解压缩软件&#xff0c;软件具备了专业、实用、简单等特点&#xff0c;它可以让用户更快捷的向压缩文件中添加和删除文件&#xff0c;同时兼容性也十分优秀&#xff0c;支持ZIP &#xff0c; SIT &#xff0c; TAR、BZIP2 &…

Linux 系统日常运维经典技能

【微|信|公|众|号&#xff1a;厦门微思网络】 【微思网络www.xmws.cn&#xff0c;成立于2002年&#xff0c;专业培训21年&#xff0c;思科、华为、红帽、ORACLE、VMware等厂商认证及考试&#xff0c;以及其他认证PMP、CISP、ITIL等】 linux运维必备认证-RHCE&#xff0c;学RHC…

mysql 物理备份及恢复

一、物理复制的基本概念 物理备份:直接复制数据库文件&#xff0c;适用于大型的数据库环境&#xff0c;不受存储引擎的限制&#xff0c;但不能恢复到不同的mysql版本 完整备份&#xff1a;也叫完全备份&#xff0c;每次将所有数据&#xff08;不管自第一次备份有没有修改过&…

盘点日本IT行业到底怎么样?赴日IT分析

相比其它行业&#xff0c;日本的IT行业对于人才需求旺盛、就业前景比较光明。一方面&#xff0c;日本IT企业在创新和开发方面寻求领先&#xff0c;需要大量的IT人才为其所用。另一方面&#xff0c;随着全球数字化趋势的加速和政府信息化的不断推进&#xff0c;各个领域都在不断…