在前面咱已经写过一个简单的hello模块 在加载和卸载的时候在端口打印出调试信息,里面有这么一句话:
printk("<1>\n hello world!\n")
我还看到有人这么写:
printk(KERN_INFO"\n hello world!\n")
#他们哥俩好像啊
里面涉及到了printk 消息级别定义
#define KERN_EMERG "<0>" /*紧急事件,一般是系统崩溃之前的提示消息*/
#define KERN_ALERT "<1>" /*必须立即采取行动*/
#define KERN_CRIT "<2>" /*临界状态,通常涉及严重的硬件或者软件操作失败*/
#define KERN_ERR "<3>" /*用于报告错误状态,设备驱动会经常使用KERN_ERR来报告硬件错误*/
#define KERN_WARNING "<4>" /*对可能出现问题的情况进行警告,这类情况通常不会对系统造成严重问题 */
#define KERN_NOTICE "<5>" /*有必要进行提示的正常情形,许多与安全相关的状况用这个级别进行汇报*/
#define KERN_INFO "<6>" /*内核提示性信息,很多驱动程序在启动的时候以这个级别打印找到的硬件信息*/
#define KERN_DEBUG "<7>" /*用于调试信息*/
模块加载函数
Linux模块加载函数一般以__init标识声明
static int __init hello_init(void)
{
printk("<1>\n hello world!\n");
printk("<1>\n This is first driver program.\n\n");
return 0;
}
module_init(hello_init);
模块加载函数必须以“module_int(函数名)”的形式被指定。他返回整型值,若初始化成功,返回0否则返回错误编码。在<linux/errno.h>中定义
在Linux2.6中能够使用request__module(const char *fmt,...)函数加载内核模块
模块卸载函数
典型的内核模块卸载函数
static void __exit hello_exit(void)
{
printk("<1>\n Exit!\n");
printk("<1>\n Goodbye Embedsky!\n\n");
}
module_exit(hello_exit);
模块卸载函数在模块卸载的时候执行,不返回任何值,必须以“module_exit(函数名)”的形式指定,用来卸载模块、释放资源。