zoukankan      html  css  js  c++  java
  • 【整理】--【内核模块】简单例子,编译加载

    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     (模块加载完成)

  • 相关阅读:
    ARM处理器
    进程和线程通俗理解
    const与指针
    字符提取命令
    ThinkPHP之视图模版的使用
    ThinkPHP之MVC与URL访问
    ThinkPHP之项目搭建
    android之文件存储和读取
    cryptdb中wrapper.lua的分析
    cryptDB安装分析
  • 原文地址:https://www.cnblogs.com/apolloenterprise/p/4409968.html
Copyright © 2011-2022 走看看