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

二、什么是 模块

  • 模块的全称是“动态可加载内核模块”(Loadable Kernel Module,LKM)
  • 模块实际上是一种目标对象文件(.ko)
  • 没有链接,不能独立运行,但是其代码可以在运行时链接到系统中作为内核的一部分运行或从内核中取下,从而可以动态扩充内核的功能
  • 模块在内核空间运行
  • 这种目标代码通常由一组函数和数据结构组成

三、Linux内核模块的特点

  • 优点
  1. 使得内核更加紧凑和灵活
  2. 修改内核时,不必全部重新编译整个内核。系统如果需要使用新模块,只要编译相应的模块,然后使用insmod将模块装载即可;
  3. 模块的目标代码一旦被链接到内核,它的作用域和静态连接的内核目标代码完全等价;
  • 缺点
  1. 由于内核所占用的内存是不会被换出的,所以链接进入内核的模块会给整个系统带来一定的性能和内存利用方面的损失;
  2. 装入内核的模块就成为内核的一部分,可以修改内核中的其他部分,因此,模块的使用不当会导致系统崩溃;
  3. 为了让内核模块能访问所有内核资源,内核必须维护符号表,并在装如何卸载模块式修改符号表;
  4. 模块会要求利用其它模块的功能,所以,内核要维护模块之间的依赖性

四、Linux内核模块与应用程序的区别

  应用程序 内核模块
使用函数 Libc库 内核函数
运行空间 用户空间 内核空间
运行权限 普通用户 超级用户
入口函数 main() module_init
出口函数 exit() module_exit
编译 gcc make
链接 gcc insmod
运行 直接运行 insmod
调试 gdb kdbug、kdb、kgdb
相关链接: http://www.tldp.org/LDP/lkmpg/2.6/html/x427.html
五、模块相关命令
  • 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来生成。

Linux内核模块-初识LKM(一)相关推荐

  1. 添加简单的linux内核模块,操作系统实践 第12章-添加最简单的Linux内核模块.ppt

    操作系统实践 第12章-添加最简单的Linux内核模块.ppt 文档编号:310662 文档页数:16 上传时间: 2018-07-21 文档级别: 文档类型:ppt 文档大小:2.00MB 第12章 ...

  2. Linux可加载内核模块(LKM)(转载)

    转载: 漏天剑 文章导航: 为校长杯流尽最后一滴血, Lkm注射, 返回首页 Linux可加载内核模块(LKM) Linux可加载内核模块完全版 --黑客.病毒程序编写者和系统管理员的概念性指南 作者 ...

  3. 编写Linux内核模块——第三部分:按键和发光二极管

    [编者的话]了解了基本的内核模块开发.内核空间和用户空间交互之后,终于要开始和硬件设备直接交互了.Linux内核提供了对通用输入输出接口.中断请求等的封装,让驱动开发者可以利用中断来控制硬件线路上的设 ...

  4. 编写Linux内核模块——第一部分:前言

    [编者的话]Linux内核模块作为Linux内核的扩展手段,可以在运行时动态加载和卸载.它是设备和用户应用程序之间的桥梁,可以通过标准系统调用,为应用程序屏蔽设备细节.本文来自Derek Molloy ...

  5. 编写函数实现员工信息录入和输出_编写我的第一个Linux 内核模块“hello_module”...

    前言: Linux 内 核 模 块 全 称 为 " 动 态 可 加 载 内 核 模 块 (Loadable Kernel Module,LKM)",是系统内核向外部提供的功能插口. ...

  6. linux内核模块实验,linux内核模块实验(2学时)

    第一个内核模块实验 一:预习要求: (1 )做本实验之前,请复习相关内核模块知识. (2 )请了解内核模块的编写.编译及安装与卸载方法. (3 )请学习内核打印函数printk() 的用法. (4 ) ...

  7. linux内核模块实验,linux内核模块实验(2学时).doc

    第一个内核模块实验 一: 预习要求: ( 1 ) 做本实验之前,请复习相关内核模块知识. ( 2 ) 请了解内核模块的编写.编译及安装与卸载方法. ( 3 ) 请学习内核打印函数 printk() 的 ...

  8. linux如何卸载内核模块_如何加载或卸载Linux内核模块

    linux如何卸载内核模块 本文摘自Manning出版的< Linux in Action>第15章. Linux使用内核模块管理硬件外围设备. 这是这样的. 一个运行中的Linux内核是 ...

  9. 1添加最简单的Linux内核模块

    1添加最简单的Linux内核模块 一.实验目的 1 熟练掌握基本的Linux内核模块开发框架和编译方法. 2 熟练掌握Linux内核模块添加流程. 3 理解Linux内核模块代码中的一些常见宏和参数. ...

最新文章

  1. R语言使用psych包的fa函数对指定数据集进行因子分析(输入数据为相关性矩阵)、使用nfactors参数指定抽取的因子的个数、fa函数因子分析结果解读(Extracting common facto
  2. nginx 学习笔记(3) nginx管理
  3. java中Date与String的相互转化
  4. wpf中groupbox有什么用_环境中的硫化氢用什么检测好
  5. 【OpenCV 例程200篇】58. 非线性滤波—中值滤波
  6. 1.4编程基础之逻辑表达式与条件分支 07 收集瓶盖赢大奖
  7. 浏览器推送 comet
  8. IDEA配置插件,插件使编程更快速
  9. 利用PTGui制作全景图并用Pano2VR生成SWF文件
  10. 数据库课程设计练习- 视图的使用
  11. C++中智能指针-atuo_ptr、unique_ptr
  12. 拍拍贷魔镜杯风控算法大赛项目
  13. vue3项目简化Compositions API使用-省去频繁的import和各use函数调用
  14. win10关闭电池保护模式_win10系统Ie浏览器开启、关闭保护模式的操作方法
  15. Chrome游览器下载
  16. Edge浏览器越来越难用了?又惹“众怒”!
  17. Java菜鸟到大牛学习路线之高级篇
  18. break语句和continue语句的区别
  19. 取证技术---电子数据取证技术基础知识点
  20. 数字图像处理学习笔记(四)点处理:灰度值反转、对数变换、伽马变换

热门文章

  1. hexo修改index.html,Hexo自定义页面做首页
  2. github push 出错:fatal: Authentication failed for 'https://github.com/ ..的解决
  3. user()与current_user()
  4. C++初学必练基础题【第二期】
  5. 刀片服务器怎么连接显示屏,CMC是如何连接的 刀片管理模块的秘密
  6. 感谢在俄勒冈州Develo的SAOs软件协会参加我的演讲“音乐背后的Web服务”的所有人...
  7. Java 开源中文分词器Ansj 学习教程
  8. 如何让一个内向的人锻炼与人交流能力?
  9. linux中哪个系统适合做服务器
  10. 关于企业服务总线ESB