Linux 基本module结构与hello.ko的编写

2019-07-13 00:11发布

data/attach/1907/lk19fg3t8orxistflmsg4qedgcluzuil.jpg 平台:ubuntu 15.04  最近在学习嵌入式Linux,这里是简单的module编写,作为我自己的学习记录,以便将来查看,也作为后来者参考。 Linux module基本结构如下图所示:
hello.c编写: #include
#include

int static hello_init( void )                  //模块加载函数
{
   printk(KERN_WARNING"hello word ");
   return 0 ;
}


int static  hello_exit( void )                 //模块卸载函数
{

   printk(KERN_INFO"goodbye!! ");
   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 


内核信息打印级别: 中定义了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。