THIS_MODULE详解

UMD模块格式原理详解:一文读懂前端模块兼容的终极方案 在JavaScript模块化演进过程中,CommonJS、AMD与浏览器全局变量曾长期并存,导致同一份代码在不同环境下加载方式各异。UMD正是为解决这一兼容问题而生的通用模块定义规范,它通过环境嗅探与分支导出,让库同时支持Node的require、浏览器的script标签以及AMD加载器。理解UMD不仅能解释为什么许多npm包存在多份dist文件,也有助于工程实践中正确处理打包器入口、全局变量冲突和跨端加载问题。从模块化基础概念到UMD包装器结构,再到Rollup构建输出与package.json入口配置, 阅读详情

转帖网址:

http://blog.youkuaiyun.com/a954423389/archive/2010/12/27/6101369.aspx 

源码位置:

@ kernel/module.c

@ include/linux/module.h


结构体struct module在内核中代表一个内核模块,通过insmod(实际执行init_module系统调用)把自己编写的内核模块插入内核时,模块便与一个 struct module结构体相关联,并成为内核的一部分。下面是结构体struct module的完整定义,接下来会逐个解释:

    struct module

    {

        enum module_state state;

        struct list_head list;

        char name[MODULE_NAME_LEN];

 

        struct module_kobject mkobj;

        struct module_param_attrs *param_attrs;

        const char *version;

        const char *srcversion;

 

        const struct kernel_symbol *syms;

        unsigned int num_syms;

        const unsigned long *crcs;

 

        const struct kernel_symbol *gpl_syms;

        unsigned int num_gpl_syms;

        const unsigned long *gpl_crcs;

 

        unsigned int num_exentries;

        const struct exception_table_entry *extable;

 

        int (*init)(void);

        void *module_init;

        void *module_core;

        unsigned long init_size, core_size;

        unsigned long init_text_size, core_text_size;

        struct mod_arch_specific arch;

        int unsafe;

        int license_gplok;

 

#ifdef CONFIG_MODULE_UNLOAD

        struct module_ref ref[NR_CPUS];

        struct list_head modules_which_use_me;

        struct task_struct *waiter;

        void (*exit)(void);

#endif

 

#ifdef CONFIG_KALLSYMS

        Elf_Sym *symtab;

        unsigned long num_symtab;

        char *strtab;

        struct module_sect_attrs *sect_attrs;

#endif

        void *percpu;

        char *args;

    };

    我们插入一个内核模块,一般会使用工具insmod,该工具实际上调用了系统调用init_module,在该系统调用函数中,首先调用 load_module,把用户空间传入的整个内核模块文件创建成一个内核模块,返回一个struct module结构体。内核中便以这个结构体代表这个内核模块。

    state是模块当前的状态。它是一个枚举型变量,可取的值为:MODULE_STATE_LIVE,MODULE_STATE_COMING,MODULE_STATE_GOING。分别表示模块当前正常使用中(存活状态),模块当前正在被加载,模块当前正在被卸载。load_module函数中完成模块的部分创建工作后,把状态置为MODULE_STATE_COMING,sys_init_module函数中完成模块的全部初始化工作后(包括把模块加入全局的模块列表,调用模块本身的初始化函数),把模块状态置为MODULE_STATE_LIVE,最后,使用rmmod工具卸载模块时,会调用系统调用delete_module,会把模块的状态置为MODULE_STATE_GOING。这是模块内部维护的一个状态。

    list是作为一个列表的成员,所有的内核模块都被维护在一个全局链表中,链表头是一个全局变量struct module *modules。任何一个新创建的模块,都会被加入到这个链表的头部,通过modules->next即可引用到。

    name是模块的名字,一般会拿模块文件的文件名作为模块名。它是这个模块的一个标识。

    另外,还要介绍一下宏THIS_MODULE,它的定义如下是#define THIS_MODULE (&__this_module),__this_module是一个struct module变量,代表当前模块,跟current有几分相似。可以通过THIS_MODULE宏来引用模块的struct module结构,试试下面的模块:

    #include <linux/module.h>

 

    MODULE_LICENSE("Dual BSD/GPL");

 

    static int hello_init(void)

    {

        unsigned int cpu = get_cpu();

        struct module *mod;

        printk(KERN_ALERT "this module: %p==%p/n", &__this_module, THIS_MODULE );

        printk(KERN_ALERT "module state: %d/n", THIS_MODULE->state );

        printk(KERN_ALERT "module name: %s/n", THIS_MODULE->name );

        list_for_each_entry(mod, *(&THIS_MODULE->list.prev), list )

                printk(KERN_ALERT "module name: %s/n", mod->name );

        return 0;

    }

 

    static void hello_exit(void)

    {

        printk(KERN_ALERT "module state: %d/n", THIS_MODULE->state );

    }

 

    module_init(hello_init);

    module_exit(hello_exit);

 

owner是一个struct module *类型的结构体指针,现在告诉你的是每个struct module结构体在内核里都代表了一个内核模块,就像十七大里的每个代表都代表了一批人,至于代表了什么人,选他们的人才知道,同样,每个struct module结构体代表了什么模块,对它进行初始化的模块才知道。当然,初始化这个结构不是写驱动的人该做的事,是在刚才略过的那个从insmod或 modprobe到你驱动的xxx_init函数的曲折过程中做的事。insmod命令执行后,会调用kernel/module.c里的一个系统调用init_module,它会调用load_module函数,将用户空间传入的整个内核模块文件创建成一个内核模块,并返回一个struct module结构体,从此,内核中便以这个结构体代表这个内核模块。

再看看THIS_MODULE宏是什么意思,它在include/linux/module.h里的定义是

85 #define THIS_MODULE (&__this_module)

    是一个struct module变量,代表当前模块,与那个著名的current有几分相似,可以通过THIS_MODULE宏来引用模块的struct module结构,比如使用THIS_MODULE->state可以获得当前模块的状态。现在你应该明白为啥在那个岁月里,你需要毫不犹豫毫不迟疑的将struct usb_driver结构里的owner设置为THIS_MODULE了吧,这个owner指针指向的就是你的模块自己。那现在owner咋就说没就没了那?这个说来可就话长了,咱就长话短说吧。不知道那个时候你有没有忘记过初始化owner,反正是很多人都会忘记,大家都把注意力集中到probe、 disconnect等等需要动脑子的角色上面了,这个不需要动脑子,只需要花个几秒钟指定一下的owner反倒常常被忽视,这个就是容易得到的往往不去珍惜,不容易得到的往往日日思量着去争取。于是在2006年的春节前夕,在咱们都无心工作无心学习等着过春节的时候,Greg坚守一线,去掉了 owner,于是千千万万个写usb驱动的人再也不用去时刻谨记初始化owner了。咱们是不用设置owner了,可core里不能不设置,struct usb_driver结构里不是没有owner了么,可它里面嵌的那个struct device_driver结构里还有啊,设置了它就可以了。于是Greg同时又增加了usb_register_driver()这么一层,usb_register()可以通过将参数指定为THIS_MODULE去调用它,所有的事情都挪到它里面去做。反正usb_register() 也是内联的,并不会增加调用的开销。

其余相关网址,可供参考:

http://hi.baidu.com/_huangshuijing/blog/item/253f9a9516183f0c7bf480c5.html

http://www.embedu.org/Column/Column92.htm

Linux驱动程序中THIS_MODULE 的定义 结构体struct module在内核中代表一个内核模块,通过insmod(实际执行init_module系统调用)把自己编写的内核模块插入内核时,模块便与一个struct module结构体相关联,并成为内核的一部分。下面是结构体struct module的完整定义,接下来会逐个解释: struct module { enum module_state state; struct list_head list; char name[MODULE_NAME_LEN]; struct module_kobject mkobj; struct module_param_attrs * 立即下载

相关推荐

Microsoft Defender防病毒扫描添加排除项

Win10与Win11上的“**Microsoft Defender防病毒**”功能默认会自动扫描所有非压缩文件,如果发现病毒或疑似病毒甚至经过手动修改后某些安装文件,会自动将其删除,如果是后面两种情况,则可能会造成误报,对我们正常办公或学习造成不利影响。 此时, 我们可以将某个目录或文件设置为“**Microsoft Defender防病毒不会扫描已排除的项目**”(<red>但要注意:这些被排除的目录或文件会给笔记本造成一定的安全风险,如果真有病毒感染这些目录或文件它们也不会被“**Micr

weixin_42148668的博客 6480

THIS_MODULE的一点见解

THIS_MODULE的一点个人见解

YellowMax 2119

武汉理工大学 python实验三

请编一个程序,用户在同一行内输入两个整数,代表头和脚的数量,编程计算笼中各有多少只鸡和兔(假设鸡和兔都正常,无残疾),如无解则输出`“Data Error!题目为:今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二,问物几何?年前,《孙子算经》中记载一个有趣的问题:今有雉兔同笼,上有三十五头,下有九十四足,问雉兔各几何?有一座八层宝塔,每一层都有一些琉璃灯,每一层的灯数都是上一层的二倍,已知共有。编写一个宝塔上的琉璃灯的小程序,计算并输出每层各有多少盏琉璃灯。,如果有多个解,则分行输出,每行一个解;

2401_83472225的博客 5949

Linux module(5) - THIS_MODULE

了解THIS_MODULE 1.struct module   结构体struct module在内核中代表一个内核模块,通过insmod(实际执行init_module系统调用)把自己编写的内核模块插入内核时,模块便与一个struct module 结构体相关联,并成为内核的一部分。结构体如下所示: </include/linux/module.h> struct module ...

weixin_41028621的博客 1316

【昇腾】用MindIE(服务化方式)拉起glm4-9b-chat模型问题解决

【昇腾】用MindIE拉起glm4-9b-chat模型问题解决: LLMInferEngine failed to init LLMInferModels ERR: Failed to init endpoint! Please check the service log or console output. Killed make sure the folder's owner has execute permission.

u014448841的博客 5116

【雕爷学编程】Arduino智能家居之DS18B20温度传感器

1、温度和湿度控制:通过连接温度传感器和湿度传感器,Arduino可以实时监测室内环境的温度和湿度,并通过控制空调、加热器或加湿器等执行器,实现室内温湿度的自动调节。设计用户友好的界面和操作方式,提供简单直观的控制和反馈机制,以及考虑用户习惯和需求,能够提升系统的整体用户体验。这意味着用户可以根据自己的需求和创意,自定义和定制智能家居系统的功能和外观。5、能源管理:Arduino可以与电能监测模块和智能插座等设备结合使用,实时监测家庭能源的使用情况,并通过自动控制电器设备的开关,实现能源的有效管理和节约。

雕爷学编程 2873

Linux 模块的初始化过程

内核模块gnu.linkonce.this_module section简介

小立仔 2385

GPFS扩展技术原理(十一)-FMDN广播与EID加解密

GFPS扩展技术原理(十一)FMDN广播及EID加解密

十多年蓝牙协议软件开发,擅长蓝牙协议分析 934

Linux内核中THIS_MODULE解析

Linux内核中THIS_MODULE解析 下面分析的代码均针对于内核2.6.18 在module.h 中 THIS_MODULE的定义如下: extern struct module __this_module; #define THIS_MODULE (&__this_module) 即是保存了__this_module这个对象的地址,那

chenglinhust的专栏 2531

效果炸裂_安装midscene_copw基于midscene操作电脑_基于视觉的软件测试执行_MIDSCENE的安装和使用---AI大模型应用探索0012

摘要:本文介绍了如何通过安装MidSceneJS来增强Copaw的屏幕操作能力。首先需要安装Node.js和npm,并配置淘宝镜像源加速安装。然后全局安装MidScene CLI工具(npm install @midscene/cli -g)。接着配置视觉大模型服务,通过设置环境变量指定模型API密钥、名称、基础URL和家族类型(如qwen3.5-27b),配置文件需存放在C:\Users\Administrator.copaw目录。安装成功后,MidScene已能成功识别并操作屏幕,使用效果良好。文中还提

添柴程序猿的专栏 638

Buck电源设计常见的一些问题(一)半桥栅极驱动芯片共性失效问题

半桥驱动芯片主要用在器件可应用于电信,数据通信,便携式存储或更低电压系统中的电源转换器,半桥、全桥、推挽、同步降压,正激变换器和同步整流器等方面。当然难免会遇到不少问题。基本上我们在产品开发的过程中都遇到过栅极驱动芯片坏掉的情况,所以找了一些资料,学习学习。也查找查找原因。

小幽余生不加糖 2369

Linux中THIS_MODULE宏定义详解

from:https://www.cnblogs.com/sky-heaven/p/4554614.html 一直都在耿耿于怀,这个THIS_MODULE到底是个什么玩意,linux内核中无处不在的东西。今天上网搜了一下,算是基本明白了。网上牛人写的已经比较详细,另外目前暂时没有时间往更深层次分析,所以直接贴过来得了。。。 转帖网址: http://blog.youkuaiyun.com/a95...

boyemachao的专栏 171

基于POD和神经网络的多工况温度场重构反演系统

本文提出了一种基于本征正交分解(POD)和神经网络的多工况温度场重构反演系统。该系统通过POD方法从多工况温度场数据中提取主要特征模态,构建神经网络模型建立工况参数与POD模态系数的映射关系,实现温度场的快速重构。系统采用Python实现,包含数据预处理、POD分解、神经网络训练和温度场重构等模块。实验结果表明,该方法能够有效降低计算复杂度,实现高精度的温度场预测。

huanghm88的专栏 274

linux 内核 THIS_MODULE宏定义详解

结构体struct module在内核中代表一个内核模块,通过insmod(实际执行init_module系统调用)把自己编写的内核模块插入内核时,模块便与一个struct module结构体相关联,并成为内核的一部分。下面是结构体struct module的完整定义,接下来会逐个解释: struct module { enum module_state state...

whatday的专栏 3959

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

struct module结构体 和 THIS_MODULE详解

结构体struct module 结构体struct module在内核中代表一个内核模块,通过insmod(实际执行init_module系统调用)把自己编写的内核模块插入内核时,模块便与一个 struct module结构体相关联,并成为内核的一部分。下面是结构体struct module的完整定义,接下来会逐个解释:     struct module { enu

jk110333的专栏 1万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

THIS_MODULE

结 构体struct module在内核中代表一个内核模块,通过insmod(实际执行init_module系统调用)把自己编写的内核模块插入内核时,模块便与一个 struct module结构体相关联,并成为内核的一部分。下面是结构体struct module的完整定义,接下来会逐个解释:     struct module     {         enum module_state state;         struct list_head list;         char

2012回首嵌入式学习两年历程 1万+

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

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

上一篇: linux软中断的小结
下一篇: 在sys目录创建接口
计算机与认知
博客等级 码龄14年 31粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值