【linux API分析】module_init
linux版本:4.19
module_init()与module_exit()用于驱动的加载,分别是驱动的入口与退出函数
- module_init():内核启动时或动态插入模块时调用
- module_exit():驱动移除时调用
本篇文章介绍module_init()
module_init()
module_init()是驱动的入口函数,该函数定义在include\linux\module.h文件
/*** module_init() - driver initialization entry point* @x: function to be run at kernel boot time or module insertion** module_init() will either be called during do_initcalls() (if* builtin) or at module insertion time (if a module). There can only* be one per module.*/
#define module_init(x) __initcall(x);
__initcall(x)函数定义在include\linux\init.h文件里面
#define __initcall(fn) device_initcall(fn)
device_initcall(fn)定义也在include\linux\init.h文件里面
#define device_initcall(fn) __define_initcall(fn, 6)
__define_initcall(fn, 6)定义也在include\linux\init.h文件里面
#define __define_initcall(fn, id) ___define_initcall(fn, id, .initcall##id)
___define_initcall(fn, id, .initcall##id)定义也在include\linux\init.h文件里面
/** initcalls are now grouped by functionality into separate* subsections. Ordering inside the subsections is determined* by link order. * For backwards compatibility, initcall() puts the call in * the device init subsection.** The `id' arg to __define_initcall() is needed so that multiple initcalls* can point at the same handler without causing duplicate-symbol build errors.** Initcalls are run by placing pointers in initcall sections that the* kernel iterates at runtime. The linker can do dead code / data elimination* and remove that completely, so the initcall sections have to be marked* as KEEP() in the linker script.*/#ifdef CONFIG_HAVE_ARCH_PREL32_RELOCATIONS
#define ___define_initcall(fn, id, __sec) \__ADDRESSABLE(fn) \asm(".section \"" #__sec ".init\", \"a\" \n" \"__initcall_" #fn #id ": \n" \".long " #fn " - . \n" \".previous \n");
#else
#define ___define_initcall(fn, id, __sec) \static initcall_t __initcall_##fn##id __used \__attribute__((__section__(#__sec ".init"))) = fn;
#endif
综上module_init调用顺序如下:
module_init()--->__initcall()--->device_initcall()--->__define_initcall()--->___define_initcall()
对___define_initcall()函数进行分析
首先了解一下#与##的作用
| 符号 | 作用 | 举例 |
|---|---|---|
| ## | “##”符号可以是连接的意思 | 例如initcall_##fn##id为initcall_fnid,假设fn为fbmem_init,id=6时,initcall_##fn##id为initcall_fbmem_init6 |
| # | "#"符号可以是字符串的意思 | 例如#id为“id”,id=6时,#id为“6” |
所以module_init(fbmem_init)函数,相当于
static initcall_t __initcall_fbmem_init6 __used __attribute__((__section__(".initcall6.init"))) =fbmem_init
这行代码定义了一个静态变量__initcall_fbmem_init6,变量类型为initcall_t(是一个函数指针类型,用于表示内核的初始化函数),__used 用于告诉编译器不要将“__initcall_fbmem_Init6”变量视为未使用的变量,避免编译器优化移除它。
attribute((section(“.initcall6.init”))),编译器指令,告诉编译器将“__initcall_fbmem_init6”变量放置在‘.initcall6.init’的代码段中(这个代码段通常用于存放内核的初始化函数,在启动的时候按顺序执行,.initcall1.init、.initcall2.init 。。。)
‘= fbmem_init’ 这将’__initcall_fbmem_init6’初始化为指向‘fbmem_init’函数的指针。
总之,这段代码的作用是将‘fbmem_init’函数注册为一个初始化函数,使其在内核启动的时候执行。
对于编译成模块,执行sudo insmod的时候,是如何加载的,等我知道后再来写
相关文章:
【linux API分析】module_init
linux版本:4.19 module_init()与module_exit()用于驱动的加载,分别是驱动的入口与退出函数 module_init():内核启动时或动态插入模块时调用module_exit():驱动移除时调用 本篇文章介绍module_init() module_init() module_init…...
NSDT孪生编辑器助力智慧城市
技术有能力改变城市的运作方式,提高效率,为游客和居民提供更好的体验,实现更可持续的运营和更好的决策。 当今城市面临的主要挑战是什么,成为智慧城市如何帮助克服这些挑战? 我们生活在一个日益城市化的世界…...
如何优雅的实现接口统一调用
耦合问题 有些时候我们在进行接口调用的时候,比如说一个push推送接口,有可能会涉及到不同渠道的推送,以我目前业务场景为例,我做结算后端服务的,会与金蝶财务系统进行交互,那么我结算后端会涉及到多个结算…...
tomcat、nginx实现四层转发+七层代理+动静分离实验
实验环境: nginx1——20.0.0.11——客户端 静态页面: nginx2——20.0.0.21——代理服务器1 nginx3——20.0.0.31——代理服务器2 动态页面: tomcat1——20.0.0.12——后端服务器1 tomcat2——20.0.0.22——后端服务器2 实验步骤&…...
交通目标检测-行人车辆检测流量计数 - 计算机竞赛
文章目录 0 前言1\. 目标检测概况1.1 什么是目标检测?1.2 发展阶段 2\. 行人检测2.1 行人检测简介2.2 行人检测技术难点2.3 行人检测实现效果2.4 关键代码-训练过程 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 毕业设计…...
Java Excel转PDF,支持xlsx和xls两种格式, itextpdf【即取即用】
Java Excel转PDF itextpdf,即取即用 工具方法一、使用方式1、本地转换2、网络下载 二、pom依赖引入三、工具方法三、引文 本篇主要为工具方法整理,参考学习其他博主文章做了整理,方便使用。 工具方法 一、使用方式 1、本地转换 导入依赖创…...
重生奇迹mu宠物带来不一样的体验
重生奇迹mu宠物有什么作用? 全新版本中更是推出了各种宠物,在玩游戏时还可以带着宠物,一起疯狂的刷怪等等,可以为玩家带来非常不错的游戏体验,那么下面就来给大家说说各种宠物适合做什么事情。 1、强化恶魔适合刷怪 …...
【C++笔记】多态的原理、单继承和多继承关系的虚函数表、 override 和 final、抽象类、重载、覆盖(重写)、隐藏(重定义)的对比
1.final关键字 引出:设计一个不能被继承的类。有如下方法: class A { private:A(int a0):_a(a){} public:static A CreateOBj(int a0){return A(a);} protected:int _a; } //简介限制,子类构成函数无法调用父类构造函数初始化 //子类的构造…...
安装thinkphp6并使用多应用模式,解决提示路由不存在解决办法
1. 安装稳定版tp框架 composer create-project topthink/think tptp是安装完成的目录名称 ,可以根据自己需要修改。 如果你之前已经安装过,那么切换到你的应用根目录下面,然后执行下面的命令进行更新: composer update topthin…...
FPGA笔试
1、FPGA结构一般分为三部分:可编程逻辑块(CLB)、可编程I/O模块和可编程内部连线。 2 CPLD的内部连线为连续式布线互连结构,任意一对输入、输出端之间的延时是固定 ;FPGA的内部连线为分段式布线互连结构,各…...
Pytorch:cat、stack、squeeze、unsqueeze的用法
Pytorch:cat、stack、squeeze、unsqueeze的用法 torch.cat 在指定原有维度上链接传入的张量,所有传入的张量都必须是相同形状 torch.cat(tensors, dim0, *, outNone) → Tensor tensor:相同形状的tensor dim:链接张量的维度,不能超过传入张…...
聊聊HttpClient的RedirectStrategy
序 本文主要研究一下HttpClient的RedirectStrategy RedirectStrategy org/apache/http/client/RedirectStrategy.java public interface RedirectStrategy {/*** Determines if a request should be redirected to a new location* given the response from the target ser…...
【1day】复现宏景OA KhFieldTree接口 SQL注入漏洞
注:该文章来自作者日常学习笔记,请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与作者无关。 目录 一、漏洞描述 二、资产测绘 三、漏洞复现 四、漏洞修复 一、漏洞描述 宏景OA是一款基于...
同为科技TOWE智能PDU引领数据中心机房远控用电安全高效
随着数据中心的环境变得更加动态和复杂,许多数据中心都在对数据中心管理人员施加压力,要求提高可用性,同时降低成本,提升效率。新一代高密度服务器和网络设备的投入使用,增加了对更高密度机架的需求,并对整…...
支付成功后给指定人员发送微信公众号消息
支付成功后给指定人员(导购)发送微信公众号消息 微信openid已录入数据库表 调用后台接口发送消息接口调用代码如下: //----add by grj 20231017 start //订单支付成功发送微信公众号消息$.ajax({url:http://www.menggu100.com:7077/strutsJsp…...
漏洞复现--安恒明御安全网关文件上传
免责声明: 文章中涉及的漏洞均已修复,敏感信息均已做打码处理,文章仅做经验分享用途,切勿当真,未授权的攻击属于非法行为!文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直…...
简单的对称加密
异或 异或算法的好处便是数A和数B异或后,把结果再和数A异或便可得到B,或者和数B异或可重新得到数据A。利用异或的这个特性可简单实现数据的加密和解密算法。 恺撒密码 恺撒密码的替换方法是通过排列明文和密文字母表,密文字母表示通过将明…...
vue源码笔记之——响应系统
vue是一种声明式范式编程,使用vue者只需要告诉其想要什么结果,无需关心具体实现(vue内部做了,底层是利用命令式范式) 1. reactive为什么只能操作对象,对于基本数据类型,需要用ref? …...
Android Studio Giraffe | 2022.3.1
Android Gradle 插件和 Android Studio 兼容性 Android Studio 构建系统以 Gradle 为基础,并且 Android Gradle 插件 (AGP) 添加了几项专用于构建 Android 应用的功能。下表列出了各个 Android Studio 版本所需的 AGP 版本。 如果您的项目不受某个特定版本的 Andr…...
Spring Boot 3.0 已经就绪,您准备好了么?
Java 微服务开发框架王者 Spring 2014 年的 4 月,Spring Boot 1.0.0 正式发布。距离 1.0 版本的发布已经过去了 9 年多的时间,如今 Spring Boot 已经被 Java 开发者广泛使用,正如 JRebel 的 2022 年开发者生产力报告中提到的那样,…...
HagiCode Soul 平台技术解析:从需求萌发到独立平台的演进之路
先回顾:三次握手(建立连接)核心流程(实际版) 为了让挥手流程衔接更顺畅,咱们先快速回顾三次握手的实际核心,避免上下文脱节: 第一步(客户端→服务器)…...
面试官最爱问的哈希表实战:用C++手撕‘存在重复元素II’(附滑动窗口优化思路)
哈希表实战:从暴力解法到最优解法的完整思维路径 在技术面试中,哈希表相关题目几乎是必考内容,而"存在重复元素II"这类问题更是高频出现。这道看似简单的题目背后,隐藏着对候选人算法思维、编码能力和沟通表达的全面考察…...
Qwen3.5-4B-Claude-Opus一文详解:GGUF量化模型在低延迟推理场景下的优势
Qwen3.5-4B-Claude-Opus一文详解:GGUF量化模型在低延迟推理场景下的优势 1. 模型概述 Qwen3.5-4B-Claude-4.6-Opus-Reasoning-Distilled-GGUF是基于Qwen3.5-4B架构的推理蒸馏模型,特别强化了结构化分析、分步骤回答以及代码与逻辑类问题的处理能力。该…...
5个效率倍增技巧:ColorWanted如何解决设计师与开发者的颜色管理难题
5个效率倍增技巧:ColorWanted如何解决设计师与开发者的颜色管理难题 【免费下载链接】ColorWanted Screen color picker for Windows (Windows 上的屏幕取色器) 项目地址: https://gitcode.com/gh_mirrors/co/ColorWanted 在数字设计与开发工作中,…...
esp-nimble-cpp:ESP32上轻量级BLE C++开发指南
1. 项目概述esp-nimble-cpp是专为 ESP32 平台设计的 C 封装库,其核心目标是为 Apache NimBLE BLE 协议栈提供面向对象、线程安全且资源高效的抽象层。该库并非简单封装,而是以工程实践为导向的深度重构:它在保持与 nkolban 经典cpp_utilsBLE …...
3大核心功能解锁Wallpaper Engine资源:RePKG工具全方位应用指南
3大核心功能解锁Wallpaper Engine资源:RePKG工具全方位应用指南 【免费下载链接】repkg Wallpaper engine PKG extractor/TEX to image converter 项目地址: https://gitcode.com/gh_mirrors/re/repkg 突破资源限制的三个关键能力 你是否曾遇到这样的困境&a…...
板对板排针连接器对电子设计有哪些影响
在电子设计领域,哪怕是看着不起眼的小元件,也能起到关键作用,板对板排针连接器就是这样的存在。别看它体积小巧,却是电子设备里的核心连接部件,能让印刷电路板(PCB)之间实现无缝对接,…...
如何写 Skill
核心概念 Skill 是一个自包含的模块,用来给 Claude/Cascade 注入特定领域的知识、工作流和工具。本质上就是一个"新手入职指南",让通用 AI 变成某个领域的专家。 目录结构 skill-name/ ├── SKILL.md # 必须,核心文件 └…...
HunyuanVideo-Foley快速入门:VSCode远程开发与模型调试指南
HunyuanVideo-Foley快速入门:VSCode远程开发与模型调试指南 1. 前言:为什么选择VSCode远程开发? 如果你正在使用HunyuanVideo-Foley这类音效生成模型,可能会遇到这样的困扰:本地机器性能不足,而云服务器虽…...
2025届毕业生推荐的五大AI论文方案推荐榜单
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 普及时,人工智能生成的内容让文本展现出一种高度模式化的特性,这一情…...
