Linux insmod指令原理

本文详细阐述了Linux系统如何通过insmod命令加载内核模块,涉及sys_init_module函数、load_module过程以及do_one_initcall调用。load_module步骤包括目标文件的拷贝、地址空间分配、符号解析和重定位。此外,解释了为何目标文件需要链接成为可执行文件,因为链接器将编译后的目标文件与系统组件结合,形成完整的可执行程序。
摘要由CSDN通过智能技术生成

之前写的好像不太对,我的理解:
输入insmod xxx.ko之后(基于linux3.5版本)

  1. linux 系统会调用linux/kernel/module.c里面的sys_init_modul函数
  2. sys_init_modul函数先做一些校验,之后进行关键的两步
    mod = load_module(umod, len, uargs);//模块加载
    ret = do_one_initcall(mod->init);//模块init函数调用
  3. load_module模块加载分四步
    copy_and_check将模块从用户空间拷贝到内核空间,
    layout_and_allocate为模块进行地址空间分配,
    simplify_symbols为模块进行符号解析,
    apply_relocations为模块进行重定位。
  4. do_one_initcall就是我们自己写的module_init()驱动函数。
    在此需要另外说几点:
    xxx.ko是目标文件,无法直接运行,需要链接后才可以运行,因此就就需要进行3的load_module模块加载的那几步。有关重定位的知识见此博客:https://blog.csdn.net/gyyu32g/article/details/78508406
    链接(Link)
    目标文件经过链接(Link)以后才能变成可执行文件。既然目标文件和可执行文件的格式是一样的,为什么还要再链接一次呢,直接作为可执行文件不行吗?
    不行的!因为编译只是将我们自己写的代码变成了二进制形式,它还需要和系统组件(比如标准库、动态链接库等)结合起来,这些组件都是程序运行所必须的。
    链接(Link)其实就是一个“打包”的过程,它将所有二进制形式的目标文件和系统组件组合成一个可执行文件。完成链接的过程也需要一个特殊的软件,叫做链接器(Linker)。
    随着我们学习的深入,我们编写的代码越来越多,最终需要将它们分散到多个源文件中,编译器每次只能编译一个源文件,生成一个目标文件,这个时候,链接器除了将目标文件和系统组件组合起来,还需要将编译器生成的多个目标文件组合起来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值