【整理】--【内核模块】简单例子,编译加载

1、linux 内核模块不被编译到内核文件(zImage,bzImage), 而是在运行期间动态的安装和卸载

2、内核模块包括一下几部分:主体部分设计,编译内核模块,安装卸载NHMK,可选项使用(模块申明,MK参数,符号输出)

3、简单例子:

hello.c:

#include<linux/init.h>
#include<linux/module.h>
#include<linux/kernel.h>

MODULE_LICENSE("Dual BSD/GPL");   

static int hello_init(void)
{
    printk(KERN_ALERT "hello_init ");
    return 0;
}

static void hello_exit(void)
{
    printk(KERN_ALERT "goodbye,kernel! ");
}

module_init(hello_init);
module_exit(hello_exit);

MODULE_AUTHOR("APOLLO");                  //作者
MODULE_DESCRIPTION("This is a simple example "); //模块描述
MODULE_ALIAS("A simple example");  //别名

Makefile:

obj-m:=hello.o
PWD := $(shell pwd)

KDIR:=/work/linux-3.0.1     //使用版本的内核代码位置,此处使用的是位于/work/linux-3.0.1中的内核代码
 
all:
    make -C $(KDIR) M=$(PWD) modules
clean:
    rm -rf *.mod.c *.mod.o *.ko *.o *.tmp_versions *.order *symvers

注意:编写makefile时,不能使用初Tab键外的空格符

注意:在OK6410开发板上insmod hello.ko 时出现问题如下:

no symbol version for module_layout

  解决方式:因为使用的内核代码中没有Module.symvers,所以要生成此文件

       生成方式    $ cd lib/module/(内核使用版本)/build

             $ make

            可以发现Module.symvers生成

返回hello.c  文件所在目录

$ cd  /work/hello

$ make

$ rm -rf /nfs/hello.ko   (删除nfs中原有的hello.ko)

$ cp hello.ko  /nfs

>>>进入OK6410 终端

# insmod hello.ko     (模块加载完成)

原文地址:https://www.cnblogs.com/apolloenterprise/p/4409968.html