Linux内核模块

本文详细介绍了Linux内核模块的概念及其工作原理,包括模块如何在内核空间运行、动态加载和卸载的方法,以及模块与普通C语言程序的区别。同时探讨了模块带来的优势和潜在的问题。
Linux操作系统的内核是单一体系结构(monolithic kernel
•有了模块机制后,提高Linux操作系统的可扩充性,内核编程不再是一个恶梦
•什么是模块呢?
•模块的全称是动态可加载内核模块(Loadable Kernel Module,LKM)
模块在内核空间运行
•模块实际上是一种目标对象文件
没有链接,不能独立运行,但是其代码可以在运行时链接到系统中作为内核的一部分运行或从内核中取下,从而可以动态扩充内核的功能
这种目标代码通常由一组函数和数据结构组成

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

区别:

          C语言程序          Linux内核模块

运行     用户空间          内核空间

入口     main()           module_init()指定;

出口     无               module_exit()指定;

编译     gcc c             Makefile

连接     ld                insmod

运行     直接运行          insmod

调试     gdb               kdbug, kdb, kgdb等 



模块相关命令:
insmod <module.ko> [module parameters]
Load the module
注意,只有超级用户才能使用这个命令

rmmod
Unload the module

lsmod
List all modules loaded into the kernel
这个命令和cat  /proc/modules等价

modprobe [-r] <module name>
– Load the module specified and modules it depends

模块依赖:
一个模块A引用另一个模块B所导出的符号,我们就说模块B被模块A引用。
如果要装载模块A,必须先要装载模块B。否则,模块B所导出的那些符号的引用就不可能被链接到模块A中。这种模块间的相互关系就叫做模块依赖。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值