Linux内核模块

1.单内核体系和微内核体系

1.1微内核(Microkernelkernel)

         微内核体系的结构特点是操作系统的核心部分是一个很小的内核,实现一些最基本的服务,如创建和删除进程,内存管理,中断管理等等,而文件系统,网络协议等其他部分都在微内核外的用户空间里运行。

优点:具有很好的可扩展性而且内核非常小。

缺点:由于不同层次之间的消息传递要花费一定的代价所以效率比较低。


1.2单内核(Monolithic kernel)

Linux操作系统是单内核体系的,整个内核是一个单独的非常大的程序。

优点:单内核操作系统,所有的模块集成在一起,系统的速度和性能非常好。

缺点:可扩展性和维护性相对比较差。

模块:为了弥补单内核的缺陷,Linux操作系统使用了一种全新的机制—模块,用户可以根据需要,在不需要对内核进行重新编译的情况下,模块能动态地载入内核或从内核移出。


2.Linux内核模块

         内核模块是在内核空间运行的程序,实际上是一种目标对象文件,没有链接,不能独立运行,但是其代码可以在运行时链接到系统中作为内核的一部分运行或从内核中取下,从而可以动态扩展内核的功能。模块机制的完整叫法是动态可加载内核模块(Loadable Kernel Module)。


2.1内核模块优缺点

         内核模块可以弥补Linux操作系统中的单一体系内核在可扩展性和可维护性方面的不足。用户可以在不需要对内核重新编译的情况下将模块动态地装载或移出内核。

内核模块的优点有:

Ø  使得内核更加紧凑和灵活

Ø  修改内核时,不必全部重新编译整个内核。如需使用新模块,只需编译并装载相应模块即可。

Ø  模块可以不依赖于硬件平台。

Ø  模块目标代码链接到内核后,和静态链接的内核目标代码完全等价;调用模块函数时无需显式的消息传递。

内核模块的缺点有:

Ø  内核所占用的内存是不会换出的,因此装载内核的模块会给整个系统带来一定的性能和内存利用的损失。

Ø  装载到内核的模块被当做内核的一部分,可以修改内核中的其它部分,所以模块使用不当会导致系统崩溃。

Ø  为了让模块访问到所有的内核资源,内核必须维护符号表,在装载和卸载模块时修改符号表。

Ø  内核需要维护模块间的依赖性。

2.2与应用程序区别

3.模块编写

(1)在第一行#define MODULE 明确这是一个模块。并且因为头文件<linux/module.h>。

(2)实现函数init_module()和cleanup_module(),分别表示注册和注销时候的操作。


4.相关概念

4.1内核符号表

         内核符号表是linux内核提供给内核代码的一部分引用,所指的“内核代码”包括内核以及驱动程序等运行在内核内存空间的程序,“引用”包括对变量的引用,对函数的引用等。最常见的内核符号引用如printk打印输出。通常内核符号是由一部分内核代码提供给其他内核代码访问其内部数据的接口。在驱动程序中,如果该驱动程序中有被其他内核代码调用的部分,可以用EXPORT_SYMBOL导出到内核符号表中。

         在多层驱动模型如USB、SCSI、文件系统中一般底层的驱动程序要导出其功能调用到内核符号表中,给上层驱动调用。

         模块所声明的任何全局符号都成为内核符号表的一部分。模块根据系统符号表从内核空间中获取符号的地址,从而确保在内核空间中正确运行。


4.2引用计数器

         主要用来确保模块安全卸载,如果该模块的引用计数器不为0,则表示该模块在运行,则不能卸载。计数器的当前值可以在/proc/modules中找到。


4.3模块依赖

         模块和模块之间存在一定的依赖关系,比如A模块依赖于B模块,那么在加载A模块的时候需要先加载B模块,在卸载B模块的时候要首先卸载A模块。模块的依赖是通过引用计数器来保证其正确性的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值