linux 内核模块(linux最好用的系统)
Linux内核模块简介
Linux内核模块是将特定功能实现为独立组件的技术。它们在Linux系统开发中扮演重要角色,尤其在嵌入式设备驱动开发中。模块以动态可加载的方式提供功能,赋予系统高度灵活性。无需编译整个内核即可添加新功能,简化了集成过程。然而,模块化也引入了版本兼容性问题,可能导致内核崩溃。内存利用率较低是另一个潜在的缺点。
在模块开发中,常用指令包括:插入模块(insmod)、删除模块(rmmod)、列出所有模块(lsmod)和加载特定模块(modprobe)。modinfo命令用于获取模块信息。树形结构查看指令(tree–a)有助于理解目录层次。
内核模块的结构通常包括加载函数、卸载函数、模块许可证声明、可选的模块参数和导出符号。加载函数在模块插入时执行初始化操作,卸载函数执行相反操作。许可证声明确保模块遵守GPL协议,参数允许在加载时传递值,导出符号则允许其他模块依赖于模块中的变量和函数。
模块的编译涉及指定Makefile,其中包含构建过程所需的指令。通过Makefile编译,生成的模块文件(如book.ko)可以在系统中使用。
绕开GPL限制通常涉及将功能实现为模块,公司发布产品时只需发布模块,无需公开源代码。为了支持模块,Linux系统需具备加载和卸载功能,确保模块与内核版本兼容。
内核模块编程基础包括加载和卸载函数、模块声明、参数传递、符号导出和信息声明。模块的灵活性、可扩展性和兼容性是其核心价值所在。
Linux内核模块的概念
首先什么是内核模块呢?这对于初学者无非是个非常难以理解的概念。内核模块是Linux内核向外部提供的一个插口,其全称为动态可加载内核模块(Loadable Kernel Module,LKM),我们简称为模块。Linux内核之所以提供模块机制,是因为它本身是一个单内核(monolithic kernel)。单内核的最大优点是效率高,因为所有的内容都集成在一起,但其缺点是可扩展性和可维护性相对较差,模块机制就是为了弥补这一缺陷。
模块是具有独立功能的程序,它可以被单独编译,但不能独立运行。它在运行时被链接到内核作为内核的一部分在内核空间运行,这与运行在用户空间的进程是不同的。模块通常由一组函数和数据结构组成,用来实现一种文件系统、一个驱动程序或其他内核上层的功能。
总之,模块是一个为内核(从某种意义上来说,内核也是一个模块)或其他内核模块提供使用功能的代码块。
linux insmod命令详解
linux系统下insmod命令是什么呢?下面是insmod命令的具体介绍:
1、insmod命令简介:
insmod全称是install module,用于载入模块 install loadable kernel module。
2、语法:
insmod [-fkmpsvxX][-o模块名称][模块文件][符号名称=符号值]
3、参数:
-f不检查目前kernel版本与模块编译时的kernel版本是否一致,强制将模块载入。
-k将模块设置为自动卸除。
-m输出模块的载入信息。
-o模块名称指定模块的名称,可使用模块文件的文件名。
-p测试模块是否能正确地载入kernel。
-s将所有信息记录在系统记录文件中。
-v执行时显示详细的信息。
-x不要汇出模块的外部符号。
-X汇出模块所有的外部符号,此为预设置。
4、使用说明:
Linux有许多功能是通过模块的方式,在需要时才载入kernel。如此可使kernel较为精简,进而提高效率,以及保有较大的弹性。这类可载入的模块,通常是设备驱动程序。
insmod命令主要用于在Linux 2.4内核之前加载Linux内核模块命令。对于通过此命令加载的Linux内核模块,系统不仅不会自动解决内核模块之间的依赖关系,而且还要求将模块路径写详细。所以在Linux 2.6内核出现时,此命令已渐渐被遗忘。
加载RAID1阵列级别模块,如下所示:
[root@rhel5boot]#insmod/lib/modules/2.6.
18-8.el5/kernel/drivers/md/raid1.ko
[root@rhel5boot]#lsmod|grepraid1
raid1251530
从以上显示结果可知,RAID1模块已加载成功。只是在使用insmod命令加载模块时,需要使用绝对路径方能加载,且加载时无法自动解决依赖关系。
5、insmod和modprobe的区别:
insmod与 modprobe都是载入 kernel module,不过一般差别于 modprobe能够处理 module载入的相依问题。
比方你要载入 a module,但是 a module要求系统先载入 b module时,直接用 insmod挂入通常都会出现错误讯息,不过 modprobe倒是能够知道先载入 b module后才载入 a module,如此相依性就会满足。
不过 modprobe并不是大神,不会厉害到知道 module之间的相依性为何,该程式是读取/lib/modules/2.6.xx/modules.dep档案得知相依性的。而该档案是透过depmod程式所建立。