内核模块:
内核模块功能介绍
Linux 提供了这样的一种机制:编译出的内核本身并不需要包含所有功能,而在这些功能需要被使用的时候,其对应的代码可被动态地加载到内核中;这种机制被称为模块(Module)。模块具有以下特点。
1、模块本身不被编译入内核映像,从而控制了内核的大小。
2、模块一旦被加载,它就和内核中的其他部分完全一样.
常用命令
1、insmod:加载内核模块,譬如insmod ./hello.ko
2、modprobe:modprobe命令比insmod命令要强大,
它在加载某模块时会同时加载该模块所依赖的其他模块。
3、lsmod:获得系统中加载了的所有模块以模块间的依赖关系,该命令通过读取/proc/modules文件获取信息。
4、modinfo:使用 modinfo <模块名>命令可以获得模块的信息,包括模块的作者、模块的说明、模块所支持的参数以及vermagic。
内核模块程序结构
一个Linux 内核模块主要由以下几个部分组成。
1、模块加载函数(init必须)。
当通过 insmod或modprobe命令加载内核模块时,模块的加载函数会自动被内核执行,完成本模块的相
关初始化工作。
2、模块卸载函数(exit必须)。
当通过 rmmod命令卸载某模块时,模块的卸载函数会自动被内核执行,完成与模块加载函数相反的功能。
3、模块许可证声明(必须)。
模块许可证(LICENSE)声明描述内核模块的许可权限,如果不声明LICENSE,模块被加载时,将收到内核被污染
(kernel tainted)的警告。在 Linux 2.6 内核中,可接受的LICENSE 包括“GPL”、“Dual BSD/GPL”等。大多
数情况下,内核模块应遵循GPL 兼容许可权。
注:不声明模块许可,会导致无法会使用内核提供的众多API.
4、 模块参数(可选)。
模块参数是模块被加载的时候可以被传递给它的值,它本身对应模块内部的全局变量。
5、 模块导出符号(可选)。
内核模块可以导出符号(symbol,对应于函数或变量),这样其他模块可以使用本
模块中的变量或函数。
6、模块作者等信息声明(可选)。
Linux设备总体介绍
n 字符设备
一个字符( char ) 设备是一种可以当作一个字节流来存取的设备( 如同一个文件 );