模块加载过程分析:INSMOD DEMODEV.KO

本文详细分析了Linux内核驱动的模块加载过程,特别是通过insmod命令加载DEMODEV.KO模块的过程。加载过程分为两步:调用load_module完成核心加载任务,以及模块加载成功后的后续工作。结构体struct module用于表示内核中的模块,并通过全局变量modules管理。此外,介绍了模块的版本控制机制,强调了CONFIG_MODVERSIONS宏的重要性以及相关版本控制文件的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

详细 驱动加载过程可以参考《深入理解Linux内核驱动》陈学松 著
insmod利用文件系统接口将数据读取到用户空间的一段内存中,然后通过系统调用sys_init_module让内核去处理模块加载的整个过程。sys_init_module()执行过程可以分为两个部分。第一部分:调用load_module(),完成模块加载的核心任务;第二部分是在模块加载成功后的后续工作。

long sys_init_module(void __user * umod, unsigned long len, const char __user* uargs);

—umod是指向用户空间demodev.ko文件映像的内存地址
—len是该文件的大小
—uargs是传递给模块的参数

static struct module *load_module(void __user * umod, unsigned long len, const char __user* uargs);

关于struct module结构体。内核用该结构体来表示加载到内核的模块(即模块在linux系统中的抽象),全局变量 modules为所有模块的的标头。

struct module{
 /*主要数据类型*/
    enum module_state state; //记录模块状态
    enum module_state
{
    模块成功加载后的状态
    MODULE_STATE_LIVE,
    模块正在加载中  
    MODULE_STATE_COMING,
    模块正在卸载中
    MODULE_STATE_GOING,
};
struct list_head  list;  //内核用一个链表管理所有被成功加载的模块

char name[MODULE_NAME_LEN]; //记录模块名

    /* Exported symbols */
    const struct kernel_symbol *syms;  //导出符号表起始地址

    const unsigned long *crcs;
    unsigned int num_syms;   //导出符号校验码所在起始地址

    /* Kernel parameters. */
    struct kernel_param *kp;  //内核模块参数所在地址

    /* Startup function. */
    int (*init)(void);  //指向模块初始化函数的指针,由module_init 宏指定的函数

}
sys_init_module(){
        load_module(){
    处理过程中会将demo
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值