平台:ubuntu 15.04
最近在学习嵌入式Linux,这里是简单的module编写,作为我自己的学习记录,以便将来查看,也作为后来者参考。
Linux module基本结构如下图所示:
hello.c编写:
#include <linux/init.h>
#include <linux/module.h>
int static hello_init( void ) //模块加载函数
{
printk(KERN_WARNING"hello word\n");
return 0 ;
}
int static hello_exit( void ) //模块卸载函数
{
printk(KERN_INFO"goodbye!!\n");
return 0 ;
}
module_init(hello_init); //申明模块加载函数
module_exit(hello_exit); //申明模块卸载函数
MODULE_LICENSE("GPL"); //模块遵循协议
MODULE_AUTHOR("bmonky<1129584094@qq.com>"); //模块作者
MODULE_DESCRIPTION("a simple module "); //模块简单描述
相应Makefile的编写:(注意Makefile的第一个字母必须大写)
obj-m := hello.o
KDIR:= /lib/modules/3.19.0-15-generic/build #指明编译这个模块所依赖的内核源代码的路径
all:
make -C $(KDIR) M=$(PWD) modules # -C表示利用(KDIR)路径中的源代码进行编译
#M=(PWD)指明当前模块代码在哪里
#modules 进行编译模块这样一个动作
编译:(注意必须在root模式下编译)
如果Makefile的第一个字母不是大写,编译module就会出错,如下图所示:
将生成的hello.ko加载到内核中:
# insmod hello.ko
显示加载后模块打印的信息(ubuntu下是这样),
# dmesg | tail -1
将hello卸载从内核中卸载:
# rmmod hello
显示卸载过程中打印的信息:
# dmesg | tail -1
内核信息打印级别:
在<linux/kernel.h>中定义了8种记录级别。按照优
先级递减的顺序分别是:
KERN_EMERG
“<0>”
用于紧急消息,常常是那些崩溃前的消息。
KERN_ALERT
“<1>”
需要立刻行动的消息。
KERN_CRIT
“<2>”
严重情况。
KERN_ERR
“<3>”
错误情况。
• KERN_WARNING
有问题的警告 “<4>”
• KERN_NOTICE
正常情况,但是仍然值得注意 “<5>”
• KERN_INFO
信息型消息 “<6>”
• KERN_DEBUG
用作调试消息 “<7>”
默认打印信息级别为KERN_WARNING。