安装驱动的时候传递参数 导出符号表

news2024/9/23 7:26:16

安装驱动的时候传递参数 导出符号表

安装驱动传递参数

#include <linux/module.h>
#include <linux/init.h>


/*
module_param(name, type, perm)
功能:接收安装驱动的时候传递的参数
参数
    @name:变量名
    @type:变量的类型
        / * Standard types are:
         *  byte, hexint, short, ushort, int, uint, long, ulong
         *  charp: a character pointer
         *  bool: a bool, values 0/1, y/n, Y/N.
         *  invbool: the above, only sense-reversed (N = true). 
		 * /
    @perm:权限(/sys/module/驱动命名的目录/parameters/文件,最大权限是0664)
    
MODULE_PARM_DESC(_parm, desc) 
功能:对这个传参的变量进行描述,可以通过modinfo xxx.ko查看到描述字段
参数:
    @_parm:被描述的变量
    @desc:描述的字符串

*/
int back = 255;
module_param(back, int, 0664);
MODULE_PARM_DESC(back, "this is back var, rang[0-255]");
/*
module_param 传递参数
MODULE_PARM_DESC 提示,使用modinfo xxx.ko可以查看

方法一:
	在安装模块的时候进行赋值
	insmod param.ko back=111

方法二:
	在导入模块后
	/sys/module/驱动名/parameters/变量名
	通过cat 可以查看
	通过echo xx > 变量名可以修改
*/



static int __init param_init(void)
{
	printk("%s:%s:%d\r\n", __FILE__, __func__, __LINE__);
	printk("into param_init\r\n");
	return 0;
}


static void __exit param_exit(void)
{
	printk("%s:%s:%d\r\n", __FILE__, __func__, __LINE__);
	printk("exit param_exit\r\n");
}

module_init(param_init);
module_exit(param_exit);
MODULE_LICENSE("GPL");

符号表

两个进程之间无法相互调用另一个进程的函数,因为每个进程都独立拥有0-3G的空间,想要调用需要使用进程传参,间接调用

内核中两个驱动可以相互调用其模块内的函数,因为它们共享3-4G的内核空间,只需要一个模块导出符号表,另一个模块在编译的时候导入符号表即可。

导出符号表

demoA.c

#include <linux/module.h>
#include <linux/init.h>

int add(int x, int y)
{
	return x + y;
}

/*
EXPORT_SYMBOL_GPL(name) 
功能:导出符号表
参数:
    @name:函数名

编译此模块后会产生一个Module.symvers的文件,此文件就是符号表
*/
EXPORT_SYMBOL_GPL(add);//导出符号表

static int __init demoA_init(void)
{
	printk("%s:%s:%d\r\n", __FILE__, __func__, __LINE__);
	return 0;
}

static void __exit demoA_exit(void)
{
	printk("%s:%s:%d\r\n", __FILE__, __func__, __LINE__);
}

module_init(demoA_init);
module_exit(demoA_exit);
MODULE_LICENSE("GPL");	

导入符号表

demoB.c

#include <linux/init.h>
#include <linux/module.h>

int x , y;
module_param(x, int, 0664);
MODULE_PARM_DESC(x, "x in add");

module_param(y, int, 0664);
MODULE_PARM_DESC(y, "y in add");

/*
若是想使用其它模块的函数
首先需要其编译生成符号表
有了符号表之后有两种方法:
方法一:
	将符号表拷贝到该模块所在的目录下
方法二:
	Makefile中加入
	KBUILD_EXTRA_SYMBOLS+= /符号表所在的路径/Module.symvers

在加载驱动的时候要先加载生成符号表的模块,然后再加载此模块,否则会报错
卸载的顺序相反,否则会报错
*/
extern int add(int x, int y); //导入外部函数

static int __init demoB_init(void)
{
	printk("%s:%s:%d\r\n",__FILE__, __func__, __LINE__);
	printk("%d add %d = %d\r\n", x, y, add(x, y));
	return 0;
}

static void __exit demoB_exit(void)
{
	printk("%s:%s:%d\r\n",__FILE__, __func__, __LINE__);
}

module_init(demoB_init);
module_exit(demoB_exit);
MODULE_LICENSE("GPL");

展示

加载模块

insmod demoA.ko //demoA导出的符号表,需要先加载驱动A
insmod demoB.ko x=10 y=20  //demoB

image-20230628152047045

卸载模块

rmmod demoB
rmmod demoA

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

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

相关文章

水题杂谈222222

Trie字符串统计 思路&#xff1a; Trie字符串就是把字符串像树一样存储下来 例子&#xff1a; 将如下字符串用trie存储 然后在查找字符串的时候就顺着树查找&#xff0c;但是要在每个字符串的结尾位置打上标记 #include<iostream> #include<cmath> #include<…

23款奔驰S450 4MATIC更换原厂流星雨智能数字大灯,让智能照亮您前行的路

凭借智能数字大灯 (DIGITAL LIGHT)&#xff0c;您可体验根据其他道路使用者和周围环境进行优化调节的理想照明条件。这款包含130万像素模块大灯&#xff0c;进一步扩展了几何多光束 LED 大灯的功能。其高分辨率的照明可有针对性地点亮各个区域。解锁车辆时&#xff0c;大灯将通…

小驰私房菜_16_高通设备开机模式

[Android基础] [qcom开机模式] 用的比较多的可能是 adb reboot bootloader 和 adb reboot edl。 这2个命令都是刷机的时候会用到。 adb reboot bootloader 是进入bootloader模式&#xff0c;通过fastboot 命令来刷img文件。 adb reboot edl 是进入紧急下载模式&#xff0c;进而…

Java POI (3)—— Excel单元格复制过程中公式不生效的问题

一、出现问题的原因 在实现Excel中单元格的复制功能实现上&#xff0c;之前的代码是这样写的 /*** copyCellValue() 方法用于将源单元格的值复制到目标单元格中。* param sourceCell 是源单元格对象* param destCell 是目标单元格对象*/public static void copyCellValue(Cel…

JVM堆参数调优

1、java7 2、java8之后jvm变化 3、默认内存大小 public static void main(String[] args){ long maxMemory Runtime.getRuntime().maxMemory() ;//返回 Java 虚拟机试图使用的最大内存量。 long totalMemory Runtime.getRuntime().totalMemory() ;//返回 Java 虚拟机中的内存…

docker Alpine镜像介绍(基础镜像)

文章目录 Alpine镜像特点开发/维护者使用案例dockerfile 使用方法 https://hub.docker.com/_/alpine https://github.com/alpinejs/alpine Alpine镜像 Alpine镜像是一个基于Alpine Linux发行版构建的Docker镜像。Alpine Linux是一个轻量级的Linux发行版&#xff0c;它的目标…

H3C交换机在地址池下如何进行IP和MAC地址绑定

环境&#xff1a; H3C S6520-26Q-SI version 7.1.070, Release 6326 问题描述&#xff1a; H3C交换机在地址池下如何进行IP和MAC地址绑定 将MAC地址为0000-e03f-0305的PC机与IP地址10.1.1.1绑定&#xff0c;掩码为255.255.255.0 解决方案&#xff1a; 1.进入地址池视图 …

【Java可执行命令】(一)编译工具javac:从源代码到字节码,深入解析Java编译工具 javac ~

Java可执行命令详解之javac 1️⃣ 概念2️⃣ 优势和缺点3️⃣ 使用3.1 语法格式3.1.1 可选参数&#xff1a;-d3.1.2 可选参数&#xff1a;-classpath3.1.3 可选参数&#xff1a;-sourcepath3.1.4 可选参数&#xff1a;-target3.1.5 可选参数&#xff1a;-g 4️⃣ 应用场景5️⃣…

网络原理之传输层与网络层重点协议

目录 传输层重点协议 TCP协议 TCP协议段格式 TCP原理 确认应答机制&#xff08;安全机制&#xff09; 超时重传机制&#xff08;安全机制&#xff09; 连接管理机制&#xff08;安全机制&#xff09; 滑动窗口&#xff08;效率机制&#xff09; 流量控制&#xff08;安…

力扣 257. 二叉树的所有路径

题目来源&#xff1a;https://leetcode.cn/problems/binary-tree-paths/description/ C题解1&#xff1a;使用递归&#xff0c;声明了全局变量result&#xff0c;遇到叶子节点就将字符串添加到result中。 递归三步法&#xff1a; 1. 确认传入参数&#xff1a;当前节点已有路径…

Java 泛型进阶

目录 一、什么是泛型 二、引出泛型 1、语法 四、泛型类的使用 1、语法 2、示例 3、类型推导(Type Inference) 4、裸类型(Raw Type) &#xff08;了解&#xff09; &#xff08;1&#xff09;说明 五、泛型如何编译的 1、擦除机制 2、为什么不能实例化泛型类型数组 …

Nginx Rewrite的应用

目录 一、Nginx Rewrite 二、Rewrite的功能 1.Rewrite 跳转场景 2.Rewrite 跳转实现 3.Rewrite 实际场景 4.Rewrite 正则表达式 5.Rewrite 命令/语法格式 6.location 分类 7.location 优先级 8.Rewrite和location比较 9.根据以上了解&#xff0c;小案例来操…

【STM32】F103(64K/128K Flash)外设概述

本文介绍的是STM32F103 中等容量产品&#xff08;STM32F103x8xx和STM32F103xBxx&#xff09;的硬件数据&#xff0c;即64KB或128KB Flash&#xff0c;20KB SRAM。 ST官网资料&#xff1a;https://www.st.com/zh/microcontrollers-microprocessors/stm32f103.html ST官方的中等…

Scala中的隐式参数、隐式函数和隐式类

使用 implicit 修饰的内容是隐式内容, 隐式的特点就是遇到适应的类型会自动的应用。隐式可以使得静态类型动态化&#xff0c;为现有类库添加功能&#xff0c;隐式的代理增强一个类或者一个方法。 隐式转化的时机 当方法中的参数的类型与目标类型不一致时当对象调用所在类中不…

HOT18-矩阵置零

leetcode原题链接: 矩阵置零 题目描述 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,…

【Flutter】Flutter Redux 入门:解决状态管理的问题

文章目录 一、 前言二、 Flutter Redux 简介1. 什么是 Redux2. 为什么需要 Redux3. Flutter Redux 的作用 三、 Flutter Redux 的基本使用1. 安装和配置2. 创建 Store3. 使用 StoreProvider 四、 Flutter Redux 的基础示例1. 创建一个简单的计数器应用2. 解析代码和说明 五、 版…

解决npm WARN deprecated uuid@3.4.0: Please upgrade to version 7 or higher

一、问题 环境 系统&#xff1a;centos 7 node &#xff1a;v18.16.1 npm&#xff1a;9.5.1 安装pm2 npm install -g pm2提示报错&#xff1a; npm WARN deprecated uuid3.4.0: Please upgrade to version 7 or higher. Older versions may use Math.random() in certai…

记录react 视频和 预览拖动

一、react 视频 ##1、循环播放 import React, { useEffect, useState, useRef } from "react"; const videoRef useRef(null); const showVideoClass { display: "block", width: "100%", height: "100%" } const hindVideoClass …

Zookeeper的应用场景

一、Zookeeper的应用场景包括&#xff1a; 配置中心&#xff1a;Zookeeper可以用来存储和管理配置信息&#xff0c;例如集群中的机器配置、服务地址配置等。通过Zookeeper&#xff0c;可以将配置信息统一管理&#xff0c;同时实现动态加载和更新。统一命名服务&#xff1a;Zoo…

Ubuntu 20.04.02 LTS安装virtualbox7.0

ubuntu22.04的软件仓库也有virtualbox&#xff0c;不过版本较老。 使用安装命令&#xff1a;sudo apt install virtualbox 如果想要安装最新版&#xff0c;那么需要去官网下载deb包或者使用官方的仓库。 这里采用安装Oracle官方仓库的方法。 执行如下命令&#xff1a; wge…