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

来源:互联网 发布:oracle sql列转行函数 编辑:程序博客网 时间:2024/06/12 21:24

平台: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。

0 0