Linux的内核模块

最近学习到了这里,也记录一下

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

模块是具有独立功能的程序,它可以被单独编译,但不能独立运行。它在运行时被链接到内核作为内核的一部分在内核空间运行,这与运行在用户空间的进程是不同的。模块通常由一组函数和数据结构组成,用来实现一种文件系统、一个驱动程序或其他内核上层的功能。

一般是在设备驱动程序、文件系统等地方使用模块,而对Linux内核中极为重要的地方,如进程管理和内存管理等,无法通过模块来实现,必须直接对内核进行修改来完成。

利用内核模块的动态装载性具有如下优点:
  ·将内核映象的尺寸保持在最小,并具有最大的灵活性;
  ·便于检验新的内核代码,而不需重新编译内核并重新引导。
但是,内核模块的引入也带来了如下问题:
  ·对系统性能和内存利用有负面影响;
  ·装入的内核模块和其他内核部分一样,具有相同的访问权限,因此,差的内核模块会导致系统崩溃;
  ·为了使内核模块访问所有内核资源,内核必须维护符号表,并在装入和卸载模块时修改这些符号表;
  ·有些模块要求利用其他模块的功能,因此,内核要维护模块之间的依赖性。
  ·内核必须能够在卸载模块时通知模块,并且要释放分配给模块的内存和中断等资源;
  ·内核版本和模块版本的不兼容,也可能导致系统崩溃,因此,严格的版本检查是必需的。
  尽管内核模块的引入同时也带来不少问题,但是模块机制确实是扩充内核功能一种行之有效的方法,也是在内核级进行编程的有效途径。

就比如说操作系统的驱动程序需要代码和缓冲空间。如果某驱动程序(或其他操作系统服务)不常使用,可以不必在内存中保留该代码和数据,这部分空间可以用于其他目的,这类代码有的时候称为暂时操作系统代码,它们会根据需要去调入或者是调出,因此使用这样的代码,可以在程序执行的时候去动态的改变操作系统的大小

在Linux当中如果我们需要自己去写内核模块的话,我们就要去包含linux/module.h这个头文件,这个文件包含了对模块的结构定义以及模块的版本控制,而函数init_module()和函数cleanup_module()是模块编程中最基本的也是必须的两个函数。init_module()向内核注册模块提供新功能;cleanup_module负责注销所有由模块注册的功能。

猜你喜欢

转载自blog.csdn.net/ZCMUCZX/article/details/80336798