insmod一个ko提供基础函数供后insmod的ko使用的方法
一、背景
在内核模块开发时,多个不同的内核模块,有时候可能需要都共用一些公共的函数,比如申请一些平台性的公共资源。但是,这些公共的函数又不方便去加入到内核镜像里,这时候就需要把这些各个内核模块需要用到的一些公共的函数做到一个ko里,先insmod,这样后insmod的内核模块就可以使用这些公共的函数。
需求已经说清楚了,我们直接看代码。
二、内核模块公共api的需求实现的demo例子
我们创建一个moduleapitest文件夹来做这个demo,这个文件夹里有两个子文件夹,一个是apiko文件夹,是模拟实现公共api的一个ko(api.ko),在使用时早于其他的ko先insmod,还有一个是使用api.ko里函数的ko,我们叫useapi.ko,对应的目录叫useapiko。
下图中红色框出的是需要编写的文件:
先看一下apiko目录下的api.c和Makefile
#include <linux/module.h>
#include <linux/kernel.h>MODULE_LICENSE("GPL");
MODULE_AUTHOR("zhaoxin");
MODULE_DESCRIPTION("A simple Linux kernel module define api...");
MODULE_VERSION("1.0");void test_api_log(void) {printk(KERN_INFO "test_api_log output.\n");
}
EXPORT_SYMBOL_GPL(test_api_log);static int __init api_init(void) {printk(KERN_INFO "api_init: Module loaded.\n");return 0;
}static void __exit api_exit(void) {printk(KERN_INFO "api_exit: Module unloaded.\n");
}module_init(api_init);
module_exit(api_exit);
上图中可以看到,我们定义了一个api叫test_api_log,里面进行了一句打印,记得要EXPORT_SYMBOL或者EXPORT_SYMBOL_GPL一下
apiko里的Makefile文件如下:
obj-m += api.oall:make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modulesclean:make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
在编译时,这个提供api的ko需要先进行编译,因为编译生成的Module.symvers我们需要用:
关键是看useapi怎么才能使用到这个symbol:
useapi.c的源文件:
#include <linux/module.h>
#include <linux/kernel.h>MODULE_LICENSE("GPL");
MODULE_AUTHOR("zhaoxin");
MODULE_DESCRIPTION("A simple Linux kernel module using api...");
MODULE_VERSION("1.0");extern void test_api_log(void);static int __init useapi_init(void) {test_api_log();printk(KERN_INFO "useapi_init: Module loaded.\n");return 0;
}static void __exit useapi_exit(void) {printk(KERN_INFO "useapi_exit: Module unloaded.\n");
}module_init(useapi_init);
module_exit(useapi_exit);
可以看到useapi.c源文件里的初始化函数里使用了test_api_log:
再看一下useapi的Makefile,也就是这个功能的核心:
obj-m += useapi.oTEST_DIR = $(CURDIR)/../KBUILD_EXTRA_SYMBOLS = $(TEST_DIR)/apiko/Module.symvers
export KBUILD_EXTRA_SYMBOLSall:make -C /lib/modules/$(shell uname -r)/build M=$(PWD) TEST_DIR=$(TEST_DIR) modulesclean:make -C /lib/modules/$(shell uname -r)/build M=$(PWD) TEST_DIR=$(TEST_DIR) clean
上面Makefile里有两处关键:
1)定义KBUILD_EXTRA_SYMBOLS为提供公共api的编译产出物Module.symvers
2)注意目录如果要用当前目录这个Makefile的内置变量($(CURDIR))的话,得多用一个变量来使用它(上面例子里就是TEST_DIR),然后再把TEST_DIR传给make的编译语句:
否则,Makefile在执行时,$(CURDIR)会被解释成-C后面的目录所指向的路径:
而/home/zhaoxin/code/git/los/code/test/linux-6.5这个目录作为$(CURDIR)的话,就和你在写Makefile时认为的当前目录不一致了造成找不到这个Module.symvers的编译错误
另外,如果遇到如下的编译错误:
大概率是因为,你没有把公共函数的api进行EXPORT_SYMBOL
实验验证:
如果不先insmod api.ko的话,直接insmod useapi.ko的话,会出现如下错误:
这也是符合预期,因为这个symbol依赖api.ko的插入才存在。
下面是先insmod api.ko再insmod useapi.ko的dmesg输出:
可以看到useapi.ko能使用api.ko里的EXPORT_SYMBOL的符号
三、有哪些应用场景?
我们可以定义一些内核模块统一用到的一些日志函数,当然可以使用原生的printk,但是有时候还是使用自己写的东西拓展功能起来方便一些。比如我们可以定义一些模式,全局一块大buffer,还是分线程独立的buffer,还是分进程独立的buffer,还是按照模块独立的buffer,这些需求用自己写的一套公共的api来给各个内核模块调用,后续日志的功能改变后,各个内核模块也不用去修改各自的代码,我们可以迭代公共api的这个ko即可。
还比如说,我们可以定义一些公共的内存申请的函数和一些traceid跟踪的函数等等,可以想到进行抽象出来定义的api还有很多。
相关文章:
insmod一个ko提供基础函数供后insmod的ko使用的方法
一、背景 在内核模块开发时,多个不同的内核模块,有时候可能需要都共用一些公共的函数,比如申请一些平台性的公共资源。但是,这些公共的函数又不方便去加入到内核镜像里,这时候就需要把这些各个内核模块需要用到的一些…...
七、传统循环神经网络(RNN)
传统循环神经网络 RNN 前言一、RNN 是什么?1.1 RNN 的结构1.2 结构举例 二、RNN 模型的分类2.1 按照 输入跟输出 的结构分类2.2 按照 内部结构 分类 三、传统 RNN 模型3.1 RNN内部结构图3.2 内部计算公式3.3 其中 tanh 激活函数的作用3.4 传统RNN优缺点 四、代码演示…...
LeetCode:19.删除链表倒数第N个节点
跟着carl学算法,本系列博客仅做个人记录,建议大家都去看carl本人的博客,写的真的很好的! 代码随想录 LeetCode:19.删除链表倒数第N个节点 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表…...
【RISC-V CPU debug 专栏 2 -- Debug Module (DM), non-ISA】
文章目录 调试模块(DM)功能必须支持的功能可选支持的功能兼容性要求规模限制Debug Module Interface (DMI)总线类型地址与操作地址空间控制机制Debug Module Interface Signals请求信号响应信号信号流程Reset Control复位控制方法全局复位 (`ndmreset`)Hart 复位 (`hartreset…...
单片机学习笔记 11. 外部中断
更多单片机学习笔记:单片机学习笔记 1. 点亮一个LED灯单片机学习笔记 2. LED灯闪烁单片机学习笔记 3. LED灯流水灯单片机学习笔记 4. 蜂鸣器滴~滴~滴~单片机学习笔记 5. 数码管静态显示单片机学习笔记 6. 数码管动态显示单片机学习笔记 7. 独立键盘单片机学习笔记 8…...
基于stm32的智能教室管理系统/智能家居系统
基于stm32的智能教室管理系统/智能家居系统 持续更新,欢迎关注!!! ** 基于stm32的智能教室管理系统/智能家居系统 ** 目前,物联网已广泛应用在我们的生活中。智慧校园是将校园中的生活、学习、工作等相关的资源联系在一起,实现管理的智能化…...
基于 Qt 和 GStreamer 的环境中构建播放器
一、功能与需求分析 功能描述 播放本地视频文件(如 MP4、MKV)。 支持基本控制功能(播放、暂停、停止、跳转)。 提供音量调节功能。 在 Windows 环境下使用 Visual Studio 2022 编译。 技术选型 Qt:用于构建用户界面。 GStreamer:负责视频解码和播放。 Visual Studio 202…...
windows docker 入门
这个教程将指导你如何安装Docker、运行第一个容器以及理解一些基本概念。 第一步:安装Docker Desktop for Windows 系统要求: Windows 10 64位版本(专业版、企业版或教育版)。启用Hyper-V和Windows Subsystem for Linux (WSL 2)。…...
baomidou Mabatis plus引入异常
1 主要异常信息 Error creating bean with name dataSource 但是有个重要提示 dynamic-datasource Please check the setting of primary 解决方法: <dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring…...
深度学习中的正则化模型是什么意思?
一、定义 在深度学习中,正则化是一种用于防止过拟合的技术。过拟合是指模型在训练数据上表现非常好,但在新的、未见过的数据(测试数据)上表现很差的情况。正则化模型就是通过在损失函数中添加额外的项来约束模型的复杂度…...
修改IDEA配置导致Spring Boot项目读取application.properties中文乱码问题
之前很多配置都是放在nacos里面,然后这次同事有个配置写在application.properties中,这个配置含有中文,启动之后发现拿到的中文值会乱码,然后就帮忙看了一下问题。 排查问题 经过不停的百度、排查发现,spring读取app…...
Flink 热存储维表 使用 Guava Cache 减轻访问压力
目录 背景 Guava Cache 简介 实现方案 1. 项目依赖 2. Guava Cache 集成到 Flink (1) 定义 Cache (2) 使用 Cache 优化维表查询 3. 应用运行效果 (1) 维表查询逻辑优化 (2) 减少存储压力 Guava Cache 配置优化 总结 背景 在实时计算场景中,Flink 应用中…...
深入探索SenseVoiceSmall:高效多语言语音识别与处理模型
引言 随着人工智能技术的飞速发展,语音识别技术已经广泛应用于智能助手、客户服务、智能家居等多个领域。然而,现有的语音识别模型往往存在资源消耗大、多语言支持不足等问题。今天,我们要介绍的是来自ModelScope平台的SenseVoiceSmall模型&…...
Flink--API 之Transformation-转换算子的使用解析
目录 一、常用转换算子详解 (一)map 算子 (二)flatMap 算子 (三)filter 算子 (四)keyBy 算子 元组类型 POJO (五)reduce 算子 二、合并与连接操作 …...
每日十题八股-2024年11月27日
1.类型互转会出现什么问题吗? 2.为什么用bigDecimal 不用double ? 3.装箱和拆箱是什么? 4.Java为什么要有Integer? 5.Integer相比int有什么优点? 6.那为什么还要保留int类型? 7.说一下 integer的缓存 8.怎么…...
OpenCV截取指定图片区域
import cv2 img cv2.imread(F:/2024/Python/demo1/test1/man.jpg) cv2.imshow(Image, img) # 显示图片 #cv2.waitKey(0) # 等待按键x, y, w, h 500, 100, 200, 200 # 示例坐标 roi img[y:yh, x:xw] # 截取指定区域 cv2.imshow(ROI, roi) cv2.waitKey(0) cv…...
Java部分新特性
模式匹配 instance of 模式匹配 之前写法 public void print(Object o) {if (o instanceof String){String str (String) obj;System.out.println("This is a String of length " s.length());} else {System.out.println("This is not a String");} …...
【SpringBoot】28 API接口防刷(Redis + 拦截器)
Gitee仓库 https://gitee.com/Lin_DH/system 介绍 常用的 API 安全措施包括:防火墙、验证码、鉴权、IP限制、数据加密、限流、监控、网关等,以确保接口的安全性。 常见措施 1)防火墙 防火墙是网络安全中最基本的安全设备之一,…...
IT运维专家给年轻人一些职业上的建议
运维工作在现代企业中是非常重要的一环,保证系统的稳定性、可用性以及安全性对企业的正常运营至关重要。以下是我给年轻人的一些职业发展建议,希望能够帮助你们在运维领域找到方向并取得成功。 1. 夯实基础,扎实技术功底 精通操作系统与网络:运维工作需要深入理解操作系统…...
Django基础之路由
一.前言 前面我们说了django的安装于基础配置,基础知识点我就细分下来,每天和大家讲一点,今天就要和大家说django的基础知识点了,我们今天先来讲路由,内容不多,希望大家记住 二.传统路由 路由就是前面一个…...
Python实例化中默认值的行为及应用
Python实例化中默认值的行为及应用 适合初学者阅读 本文要点 使用可变对象作为默认参数会导致所有实例共享同一对象,引发意外的数据修改。不可变对象作为默认参数时,每次实例化都会创建新的对象,不会共享数据。推荐使用None作为默认值&…...
【WRF后处理】WRF模拟效果评价及可视化:MB、RMSE、IOA、R
【WRF后处理】模拟效果评价及可视化 准备工作模型评价指标Python实现代码Python处理代码:导入站点及WRF模拟结果可视化图形及评价指标参考在气象和环境建模中(如使用 WRF 模型进行模拟),模型性能评价指标是用于定量评估模拟值与观测值之间偏差和拟合程度的重要工具。 本博客…...
ShenNiusModularity项目源码学习(4:身份认证)
ShenNiusModularity项目有两套启动方式,一种是ShenNius.Admin.Mvc项目启动,该项目为MVC模式,带前台页面,也有后台服务,另一种是ShenNius.Admin.Hosting,该项目启动后仅提供后台服务,供其它前台项…...
python+django自动化部署日志采用WebSocket前端实时展示
一、开发环境搭建和配置 # channels是一个用于在Django中实现WebSocket、HTTP/2和其他异步协议的库。 pip install channels#channels-redis是一个用于在Django Channels中使用Redis作为后台存储的库。它可以用于处理#WebSocket连接的持久化和消息传递。 pip install channels…...
flink学习(6)——自定义source和kafka
概述 SourceFunction:非并行数据源(并行度只能1) --接口 RichSourceFunction:多功能非并行数据源(并行度只能1) --类 ParallelSourceFunction:并行数据源(并行度能够>1) --接口 RichParallelSourceFunction:多功能并行数据源(并行度能够>1) --类 【建议使用的】 ——…...
开发常见问题及解决
1.DBeaver 报Public Key Retrieval is not allowed 在使用DBeaver连接数据库时出现“Public Key Retrieval is not allowed”错误,主要是因为数据库连接配置的安全策略导致的。以下是详细的解释和解决方法: 错误原因 这个错误通常出现在连接MySQL数据…...
python excel接口自动化测试框架!
今天采用Excel继续写一个接口自动化测试框架。 设计流程图 这张图是我的excel接口测试框架的一些设计思路。 首先读取excel文件,得到测试信息,然后通过封装的requests方法,用unittest进行测试。 其中,接口关联的参数通过正则进…...
mybatis:You have an error in your SQL syntax;
完整报错You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near false, false, false, false, false, false, false, false, false, false, false, at line 1 SQL: INSERT INTO user …...
使用 Maven 开发 IntelliJ IDEA 插件
使用 Maven 开发 IntelliJ IDEA 插件的完整流程 1. 创建 Maven 项目 1.1 使用 IntelliJ 创建 Maven 项目 打开 IntelliJ IDEA,点击 File > New > Project。选择 Maven,填写项目名称和 GroupId,例如: GroupId: com.exampl…...
Windows修复SSL/TLS协议信息泄露漏洞(CVE-2016-2183) --亲测
漏洞说明: 打开链接:https://docs.microsoft.com/zh-cn/troubleshoot/windows-server/windows-security/restrict-cryptographic-algorithms-protocols-schannel 可以看到: 找到:应通过配置密码套件顺序来控制 TLS/SSL 密码 我们…...
wordpress 主题笔记/seo服务外包价格
话不多说,首先先看效果图,它能够记录你在使用过程中的历史,方便你查看是否有错:接下来就仔细分析一下是如何制作的:简易计算器第一步:导入资源库第二步:创建窗口第三步:变量初始化第…...
阳江市网站建设/网站建设需求模板
***********************************************声明************************************************************ 原创作品,出自 “晓风残月xj” 博客,欢迎转载,转载时请务必注明出处(http://blog.csdn.net/xiaofengcanyuex…...
网站制作方法/网站seo置顶
2014年9月19日,阿里巴巴成功上市,成为美国史上IPO数额最大的公司,一夜间成为世界第二大互联网公司,其市值首日即超过美国最大电商亚马逊加EBay之和。 阿里巴巴路演IPO时每股估值不过68美元,而首日收盘价达到每股93.89…...
淘宝二官方网站是做啥的/百度做广告怎么收费
开头加入以下代码解决import codecs, sys sys.stdout codecs.getwriter(utf8)(sys.stdout.buffer)转载于:https://blog.51cto.com/superbigsea/1751824...
石家庄建网站挣钱优帮云/湖南网络推广机构
理解Session可以从其名称入手,翻译成汉语具有"会话"的意思。所谓的会话是一段有始有终的交互操作,比如通过手机与朋友进行语音通话。特别说明:Session与sessionStorage并无联系,只因名称有所关联所以做一下介绍。一.HTT…...
wordpress去除无用标签/百度怎么搜索关键词
在使用FTP向服务器传送问文件的时候,要注意选择传输模式,如果服务器用的是linux,那么一定要选二进制模式,否则传送文件的时候会出错转载于:https://blog.51cto.com/wll2015/1655774...