Linux内核模块-初识LKM(一)

一、模块机制产生的原因 
    内核模块是 Linux 内核向外部提供的一个插口,其全称为动态可加载内核模块( Loadable Kernel Module LKM ),简称模块 Linux 内核之所以提供模块机制,是因为它本身是一个单内核( monolithic kernel )。单内核的最大优点是效率高,因为所有的内容都集成在一起,但其缺点是可扩展性和可维护性相对较差,模块机制就是为了弥补这一缺陷。

二、什么是 模块
  • 模块的全称是“动态可加载内核模块Loadable Kernel ModuleLKM
  • 模块实际上是一种目标对象文件(.ko)
  • 没有链接,不能独立运行,但是其代码可以在运行时链接到系统中作为内核的一部分运行或从内核中取下,从而可以动态扩充内核的功能
  • 模块在内核空间运行
  • 这种目标代码通常由一组函数和数据结构组成
三、Linux内核模块的特点
  • 优点
  1. 使得内核更加紧凑和灵活
  2. 修改内核时,不必全部重新编译整个内核。系统如果需要使用新模块,只要编译相应的模块,然后使用insmod将模块装载即可;
  3. 模块的目标代码一旦被链接到内核,它的作用域和静态连接的内核目标代码完全等价;
  • 缺点
  1. 由于内核所占用的内存是不会被换出的,所以链接进入内核的模块会给整个系统带来一定的性能和内存利用方面的损失;
  2. 装入内核的模块就成为内核的一部分,可以修改内核中的其他部分,因此,模块的使用不当会导致系统崩溃;
  3. 为了让内核模块能访问所有内核资源,内核必须维护符号表,并在装如何卸载模块式修改符号表;
  4. 模块会要求利用其它模块的功能,所以,内核要维护模块之间的依赖性
四、Linux内核模块与应用程序的区别

 应用程序内核模块
使用函数Libc库内核函数
运行空间用户空间内核空间
运行权限普通用户超级用户
入口函数main()module_init
出口函数exit()module_exit
编译gccmake
链接gccinsmod
运行直接运行insmod
调试gdbkdbug、kdb、kgdb


五、模块相关命令
  • insmod <module.ko> [module parameters]    /*装载模块(install module),只有超级用户才能使用该命令*/
  • rmmod <module.ko>      /*卸载模块(remove module),只有超级用户才能使用该命令*/
  • modinfo <module.ko>     /*查看模块信息*/
  • lsmod    /*列表显示所有的内核模块(list  module),等价于cat /pro/modules命令*/
  • modprobe [-r] <module name>   /*载入指定的个别模块,或是载入一组相依赖的模块*/
扩展阅读:
  • 模块依赖
   一个 模块A引用另一个模块B所导出的符号,我们说 模块B被A引用
   如果 要装载模块A,必须先要装在模块B。否则模块B所导出的那些符号的引用就不可能被链接到模块A中。这种模块之间的相互关系就叫做 模块依赖
  • insmod与modprobe区别
         对于insmod,如果先载入A模块,通常都会报错。 modeprob可智能地添加和删除Linux内核模块。modprobe会查看模块 目录/lib/modules/'uname -r'里面的所有模块和文件,除了可选的/etc/modprobe.conf配置文件和/etc/modprobe.d目录外。依赖关系是通过读取/lib/modules/$(uname -r)/modules.dep得到的。该文件可用depmod来生成。
          
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值