符号导出:
Linux 2.6
中,所有的内核符号默认都是不导出的。如果希望一个模块的符号能被其它
模块使用,则必须显式的用
EXPORT_SYMBOL
将符号导出。如:
EXPORT_SYMBOL(module_symbol);
模块描述:
模块编写者还可以为所编写的模块增加一些其它描述信息,如模块作者、模块本身的描
述或者模块版本等,例如:
MODULE_AUTHOR("Abing <Linux@zlgmcu.com>");
MODULE_DESCRIPTION("ZHIYUAN ecm1352 beep Driver");
MODULE_VERSION("V1.00");
内核打印级别:pintk函数
#define KERN_EMERG "<0>" /* system is unusable */
#define KERN_ALERT "<1>" /* action must be taken immediately */
#define KERN_CRIT "<2>" /* critical conditions */
#define KERN_ERR "<3>" /* error conditions */
#define KERN_WARNING "<4>" /* warning conditions */
#define KERN_NOTICE "<5>" /* normal but significant condition */
#define KERN_INFO "<6>" /* informational */
#define KERN_DEBUG "<7>" /* debug-level messages */
//示例
printk(KERN_DEBUG"Hello, I'm ready!\n");
模块参数:
Linux
内核允许模块在加载的时候指定参数。模块接受参数传入能够实现一个模块在多
个系统上运行,或者根据插入时参数的不同提供多种不同的服务。
模块参数必须使用
module_param
宏来声明,通常放在文件头部。
module_param
需要
3
个参数:变量名称、类型以及用于
sysfs
入口的访问掩码。模块最好为参数指定一个默认值,
以防加载模块的时候忘记传参而带来错误。如下的示例在插入模块时候没有指定
num
参数
的话,模块将会使用默认值
5
:
static int num = 5;
module_param(num, int, S_IRUGO);
说明:
1)
内核模块支持的参数类型有:
bool
、
invbool
、
charp
、
int
、
short
、
long
、
uint
、
ushort
和
ulong
。
2)
访问掩码的值在
<linux/stat.h>
定义,
S_IRUGO
表示任何人都可以读取该参数,但不
能修改。
3)
支持传参的模块需包含
moduleparam.h
头文件。
参数在模块安装时进行指定,例如
# insmod hellop.ko whom="MASTER" num=5
注册函数:
所需头文件 | #include <linux/fs.h> |
函数原型 | int register_chrdev(unsigned int major, const char *name,struct file_operations *fops) |
函数传入值 | major:设备驱动程序向系统申请的主设备号,如果为 0 则系统为此驱动程序动态地分配一个主设备号 name:设备名 fops:对各个调用的入口点 |
函数返回值 | 成功:如果是动态分配主设备号,此返回所分配的主设备号。且设备名就会出现在 /proc/devices 文件里 出错:1 |
注销函数
#include <linux/fs.h> | |
int unregister_chrdev(unsigned int major, const char *name) | |
major:设备的主设备号,必须和注册时的主设备号相同 name:设备名 | |
成功:0,且设备名从/proc/devices 文件里消失 出错:1 |