模块参数与符号

内核模块参数 本文主要介绍linux kernel 中的内核模块参数,包括内核模块参数相关的宏定义,参数,以及使用方法等前面的文章已经介绍了内核模块,内核模块参数就是内核模块使用的参数,像用户程序一样, 内核模块也可以接受命令行参数,这样就可以根据给定的参数动态的改变内核模块的行为。如下图所示是,内核模块参数在内核源码中的宏定义由上图所知, module_param()主要有3个参数,分别是nametypepermname: 用作内核模块参数的变量名称。 阅读详情

模块参数

module_param(name,type, perm);
module_param_array(name, type, num, perm);
perm表示该参数在sysfs文件系统中所对应的文件节点的属性;你应该使用<linux/stat.h>中定义的权限值;这个值决定谁可以存取这些模块参数在sysfs文件系统中的表示;当perm为0时,表示此参数不存在sysfs文件系统下对应的文件节点;否则,模块被加载后,在/sys/module/目录下将会出现以此模块名命名的目录,带有给定的权限;在该目录下,有一个parameters子目录,在里面每个文件对应一个参数,参数值就在以该参数名命名的文件中。
注意:如果一个参数被sysfs修改了,那么你的模块看到的参数值也被修改了,但是你的模块不会收到任何通知;你应当不要使模块参数可写,除非你准备好检测这个改变并因而作出反应。

模块符号

EXPORT_SYMBOL标签内定义的函数对全部内核代码公开,不用修改内核代码就可以在您的内核模块中直接调用。

加入B中调用A中导出函数
[1] 在模块A中c文件或者头文件中使用EXPORT_SYMBOL(xxxx)导出函数.有些需要添加编译选项-DEXPORT_SYMTAB.
[2] 在模块B中用"extern" 申明函数(如, extern int xxxx);申明以后就能够直接使用导出的函数了。
另外:在导出函数以后,可以使用 cat  proc/kallsyms来查看所有的导出符号,其中属性为t的标识是不能被调用的,所以如果导出符号是t类型,那么无法直接被其他模块使用。
无法导出问题解决
方法一:在A模块编译好后会生成符号表文件Module_symvers,里面有函数地址和函数名对应关系,把这个文件拷贝到需要调用的B的源代码下,替换B的该文件。
然后重新编译B模块.这样就能够让B调用A的函数,以后加载模块顺序也必须先A后B,卸载相反。
方法二:将两个模块放在一个目录下,进行编译。其实和方法一类似。
这样就能够成功的实现两个模块之间的函数调用,比如KVM如果需要和驱动模块相互调用,就能使用这个方法。如果是两个模块之间需要相互调用,可以让驱动模块函数导出,KVM模块将函数指针当做回调函数传给驱动,是想双方的函数调用通讯。
/*
* 内核符号导出 给其他模块使用 使用前要申明一下
* 另外从 /proc/kallsyms 可以查看内核符号表的相关信息(eg.所在内存地址)
* eg. cat /proc/kallsyms | grep integar
*/
 
#include<linux/init.h>
 #include<linux/module.h>

 MODULE_LICENSE("Dual BSD/GPL");

 static int __init symbol_init(void)
 {
 printk("<0> symbol_init\n");
 return 0;
 }
 int add_integar(int a, int b)
 {
 return (a + b);
 }

 int sub_integar(int a, int b)
 {
 return (a - b);
 }

 static void __exit symbol_exit(void)
 {
 printk("<0> symbol_exit\n");
 }
 EXPORT_SYMBOL(add_integar);
 EXPORT_SYMBOL(sub_integar);
 module_init(symbol_init);
 module_exit(symbol_exit);

/*
*使用其他内核模块导出的符号
*/
 
#include<linux/module.h>
 #include<linux/init.h>
 extern int add_integar(int, int);
 extern int sub_integar(int, int);

 MODULE_LICENSE("GPL");

 static int __init use_symbol_init(void)
 {
 printk("<0> use_symbol_init");
 printk("<0> 1+2 = %d\n",add_integar(1,2));
 printk("<0> 3-2 = %d\n",sub_integar(3,2));
 return 0;
 }

 static void __exit use_symbol_exit(void)
 {
 printk("<0> Module exit!\n");
 }
 module_init(use_symbol_init);
 module_exit(use_symbol_exit);

内核模块参数传入与符号导出 一:模块参数 #include<linux/module.h> //#include<linux/moduleparam.h> //#include<linux/stat.h> #define CNT 1 static int cnt = CNT; static char *hi = "Hi,Linux\n"; static int arr[] = {1,2,3,4,5,6}; static int nums = sizeof(arr)/sizeof(int); /*类 阅读详情

相关推荐

MDK开发篇:基于立创逻辑派FPGA-G1与Cortex-M1软核的按键控制LED实战

本文详细介绍了基于立创逻辑派FPGA-G1开发板与高云Cortex-M1软核的完整开发流程。通过Gowin云源软件配置软核系统与GPIO外设,并在Keil MDK环境中编写按键控制LED的C程序,最终实现程序固化与上电自启动。教程涵盖硬件配置、软件开发、在线调试与固化部署全步骤,帮助STM32开发者快速上手FPGA软核开发。

weixin_42103128的博客 147

模块参数

当编写一个内核模块时,可以指定一个变量为模块的参数,在模块被加载的时候指定模块参数的值,这样可以动态的改变模块的行为。在内核中,模块参数是通过以下宏来定义的            module_param(name, type, perm);              module_param_array(name, type, &num, perm);  //这里第三个参数为可选的整形变量的

692

国家医保移动支付国密算法SM2签名验签、SM4加解密DLL

DLL,非.net开发,所以无需安装配置,直接程序引用开发即可,支持各类开发语言。已知省份有广西、贵州、安徽、河北、黑龙江、湖南、吉林、江苏、四川、新疆等各地方。国家医保移动支付国密算法SM2签名验签、SM4加解密DLL。//SM4加密与解密。支持医保移动支付(国家统一版),//SM2签名与验签。

4263

模块符号表导出

EXPORT_SYMBOL_GPL(sym) //导出符号表 usr内核模块依赖,exp内核模块,所以在加载usr.ko之前,必须先加载exp.ko 加载后的执行顺序:

yw946711214的博客 676

QT与Coin3D实现机器人的仿真

前言 Coin3D编程环境配置好后,开始下一步的机器人仿真任务。本文根据在研5轴机器人,完成三维模型生成与机器人的仿真。主要参考博主冯Jungle的博客,在此表示感谢。 ——2021.05.23 环境 Win10:VS2019、QT5.15.2、Coin3D、SolidWorks2016 机器人三维模型生成 目前广泛应用于因特网的VRML ( Virtual Reality Modeling Language,虚拟现实建模语言)为用户提供一种可参与的、并能对场景中对象主动做出反应的虚拟现实环境,现已成

焦露的博客 6907

三级等保网络拓扑图实战:从零搭建符合标准的医院安全架构

本文详细阐述了如何从零开始设计并搭建符合三级等保标准的医院网络安全架构。文章基于“一个中心,三重防护”的核心框架,深入解析了医院网络分区设计、安全域划分、关键安全设备选型与配置等实战要点,并提供了绘制专业网络拓扑图的技巧与等保测评准备指南,旨在帮助医院IT人员系统化地构建既合规又实用的纵深防御体系。

weixin_29326909的博客 504

模块标识

模块标识 模块标识是一个字符串,用来标识模块。在 require、 require.async 等加载函数中,第一个参数都是模块标识。 Sea.js 中的模块标识是 CommonJS 模块标识 的超集: 一个模块标识由斜线(/)分隔的多项组成。 每一项必须是小驼峰字符串、 . 或 .. 。 模块标识可以不包含文件后缀名,比如 .js 。 模块标识可以是 相对 或 顶级 标识。如果第...

伊昭荣(C/C++) 689

使用 Prometheus 监控 Spring Boot 应用

本文介绍了使用SpringBoot+Prometheus+Grafana实现应用监控的方案。首先在SpringBoot项目中集成Micrometer和Actuator组件,通过配置暴露Prometheus监控端点。接着配置Prometheus采集应用指标数据,并通过Grafana可视化展示。具体步骤包括:1)SpringBoot集成Micrometer;2)配置Prometheus抓取应用指标;3)安装Grafana并导入SpringBoot监控模板;4)展示JVM和业务指标。该方案可以实现对SpringB

蔡定努 430

Linux驱动内核模块参数和模块符号导出

Linux驱动之内核模块参数和模块符号导出以及模块依赖关系 当我们写应用程序可以使用scanf等函数来获取我们想要给某一变量设置的值,而驱动程序又不能使用应用层的库函数,我们怎么把值传递给驱动程序呢?我们就需要使用模块参数来完成。有两种方式修改变量的值。1、加载模块时修改变量的值2、模块加载后修改变量的值。

qq_53221728的博客 915

在 ABAP 平台上搭建 OAuth 2.0 Server:架构、流程、权限与落地实战

摘要:本文为SAP ABAP开发人员提供将ABAP平台配置为OAuth 2.0授权服务器的实战指南。重点介绍两种授权流程(授权码和SAML Bearer)的实现方案,包括核心事务配置(SOAUTH2/SAML2)、授权对象(S_SCOPE)管理以及端点交互规范。通过具体配置清单和三类典型集成场景(第三方Web应用访问OData、企业集成平台调用、BTP应用对接)的落地示例,帮助读者快速构建安全的OAuth 2.0服务架构。文档强调SSL/TLS基础安全、scope最小授权原则以及授权与令牌端点的标准交互模式

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 308

第一节:Vben Admin介绍和初次运行

本文是【实战Vben Admin + Python】的第一节,本文内容主要是介绍Vben Admin框架和我们后端使用的技术,开发环境和工具的准备本节文章的目的是Vben Admin的简单介绍,通过配置可以让项目前端运行起来,由于项目默认开启了mock,展示的都是静态模拟数据,我们在此基础上,下一节将研究分析下Vben Admin的目录。为我们后端搭建准备。

cuiwin的专栏 7411

Linux驱动学习之模块化,参数传递,符号导出

加载驱动可以传递参数如:(insmod 01_module_test.ko string="seven" var=10),这里初始化的时候不设置参数,通过修改 /sys/module/01_module_test/parameters/变量名 这个文件去修改对应的值,然后卸载程序的时候打印出来看看。:当通过rmmod命令卸载模块时,模块的卸载函数会自动被内核执行,完成与模块加载函数相反的功能;模块参数(可选):模块参数是模块被加载的时候可以被传递给他的值,它本身对应模块内部的全局变量;

m0_46392035的博客 1548

SAP SEGW 事物码里的 Function Import

开放数据协议(OData)包括标准的 CRUD (创建、检索、更新和删除)操作,这些操作映射到 HTTP 方法的 POST、GET、PUT/MERGE 和 Delete 几类。此外,OData还支持进一步的服务操作:,这些操作可以由HTTP方法GET或POST调用,用于处理不能映射到标准 CRUD 操作的任何内容。通过在数据模型中创建 ,可以在 service Builder 中实现此类额外的服务操作。例如,您可以为以下自定义操作创建函数导入:Work Item confirmation检查航班的可用性虽然

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 994

Linux 驱动之模块参数和符号导出

Linux 驱动之模块参数和符号导出 2016-12-01 10:18:41 分类: LINUX 原文地址:Linux 驱动之模块参数和符号导出 作者:草根老师

xulingxin的博客 489

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

手把手教Linux驱动2-之模块参数和符号导出

通过《手把手教Linux驱动1-模块化编程》的学习,我们已经掌握了如何向内核加载一个模块,现在我们学习模块之间如何传递参数。 一、给模块传递参数 当我们加载一个模块到Linux内核的时候,Linux内核允许向这个模块传递一些参数。这样设计的好处就是,让我们的模块操作起来更灵活,我们可以通过给它传递不同的参数来完成不同的功能。例如:我们写一个模块程序,来完成硬件中断的操作。在Linux操作系统中,每个中断都有一个中断号。如果我们在模块里面将中断号写死,那我们的模块只能响应特定的中断了。如果我们把中断号作为参数

一口Linux的专栏 1332

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

驱动模块的介绍 参数 导出符号

#include #include static int num = 2; static char *name = "hello_world"; static int hello_init(void) { printk("this is the first driver programmer\n"); printk("num = %d, name =%s\n ",

u013702980的专栏 591

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

接收多个文件和参数_手把手教Linux驱动2-之模块参数和符号导出

通过《手把手教Linux驱动1-模块化编程,玩转module》的学习,我们已经掌握了如何向内核加载一个模块,现在我们学习模块之间如何传递参数。一、给模块传递参数当我们加载一个模块到Linux内核的时候,Linux内核允许向这个模块传递一些参数。这样设计的好处就是,让我们的模块操作起来更灵活,我们可以通过给它传递不同的参数来完成不同的功能。例如:我们写一个模块程序,来完成硬件中断的操作。在Linux...

weixin_39539733的博客 82

2 export 参数_手把手教Linux驱动2模块参数param和符号导出export用法

通过《手把手教Linux驱动1-模块化编程》的学习,我们已经掌握了如何向内核加载一个模块,现在我们学习模块之间如何传递参数和如何导出模块的符号。给模块传递参数当我们加载一个模块到Linux内核的时候,Linux内核允许向这个模块传递一些参数。这样设计的好处就是,让我们的模块操作起来更灵活,我们可以通过给它传递不同的参数来完成不同的功能。例如:我们写一个模块程序,来完成硬件中断的操作。在L...

weixin_42511098的博客 306

linux驱动开发LDD(二)——符号导出和模块参数

(一)导出符号 它是用于解决模块之间的相互函数调用问题   export.c #include <linux/init.h> #include <linux/module.h> int my_add(int x, int y) { printk("<1>" "enter %s\n", __func__); return x+y; ...

u013511885的博客 535

linux查看导出符号,linux驱动入门——模块参数和导出符号

驱动程序中lsmod命令实际读取的是/proc/modules文件即与lsmod命令对应的结果是cat /proc/modules内核中已经加载的模块的信息存在于/sys/module目录下modprobe命令比insmod命令要强大,它在加载某模块时会同时加载该模块所依赖的其他模块使用modprobe -r filename的方式卸载将同时其依赖的模块modinfo模块名命令可以获得模块的信息m...

weixin_31100517的博客 413

linux驱动入门——模块参数和导出符号

驱动程序中lsmod命令实际读取的是/proc/modules文件  即与lsmod命令对应的结果是cat /proc/modules  内核中已经加载的模块的信息存在于/sys/module目录下  modprobe命令比insmod命令要强大,它在加载某模块时会同时加载该模块所依赖的其他模块  使用modprobe -r filename的方式卸载将同时其依赖的模块  mod

eydwyz的专栏 1128

Linux内核模块:初始化、加载/卸载、模块参数、导出符号、错误处理、模块装载竞争

一、代码 模块1:

kanguolaikanguolaik的专栏 2464

struts int参数没法传string_手把手教Linux驱动2模块参数param和符号导出export用法

通过《手把手教Linux驱动1-模块化编程》的学习,我们已经掌握了如何向内核加载一个模块,现在我们学习模块之间如何传递参数和如何导出模块的符号。给模块传递参数当我们加载一个模块到Linux内核的时候,Linux内核允许向这个模块传递一些参数。这样设计的好处就是,让我们的模块操作起来更灵活,我们可以通过给它传递不同的参数来完成不同的功能。例如:我们写一个模块程序,来完成硬件中断的操作。在L...

weixin_39600616的博客 88

存在正文时不允许未命名的原型参数_手把手教Linux驱动2-之模块参数和符号导出...

通过《手把手教Linux驱动1-模块化编程,玩转module》的学习,我们已经掌握了如何向内核加载一个模块,现在我们学习模块之间如何传递参数。一、给模块传递参数当我们加载一个模块到Linux内核的时候,Linux内核允许向这个模块传递一些参数。这样设计的好处就是,让我们的模块操作起来更灵活,我们可以通过给它传递不同的参数来完成不同的功能。例如:我们写一个模块程序,来完成硬件中断的操作。在Linux...

weixin_39809168的博客 109
上一篇: likely && unlikely
下一篇: 一张图说明Linux内核
IT_Linux
博客等级 码龄14年 31粉丝 77原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值