Linux内核模块添加的两种方法



Linux内核模块添加的两种方法

  1. 静态加载

    把组件都添加进内核文件中,在目录kongfig文件中增加新代码对应的编译选项,在Makefile文件中添加编译条目。

  2. 动态加载

    下载并安装Linux内核模板:

    make modules _install ARCH = arm CROSS _COMPILE=arm-linux

    编写Makefile

    hello world为例来实现这两种方法

    静态加载

    1hello world.c源代码

    #include

    #include

     

    static int hello_init(void)

    {

    printk(KERN_INFO " Hello World enter\n");

    return 0;

    }

     

    static void hello_exit(void)

    {

    printk(KERN_INFO " Hello World exit\n ");

    }

     

    module_init(hello_init);

    module_exit(hello_exit);

     

    MODULE_AUTHOR("Barry Song <[email protected]>");

    MODULE_LICENSE("Dual BSD/GPL");

    MODULE_DESCRIPTION("A simple Hello World Module");

    MODULE_ALIAS("a simplest module");

     

    把所有的组件都翻译进内核文件,即生成zImagebzImage

     

    1)进入linux-2.6.32.2-mini2440内核


    2)进入/drivers建立Hello文件夹,在Hello文件夹里面建立hello.c,Makefile,Kconfig

    Makefielobj-y(CONFIG_HELLO_WORD)  +=hello.o

    Kconfigconfig hello_word

    tristate "TEST hello word"

    help

    usually you have to make

    3)在drivers里面的Makefile添加:obj-y(CONFIG_HELLO_WORD)    +=Hello/


     

    4)在drivers里面的Kconfig添加  source"drivers/Hello/Kconfig"

    5)输入make menuconfig进入内核配置界面

    6)然后输入y退出并保存

    7)生成了.config文件为配置的记录

     

    8)在make bzImage进行编译内核

    9)然后在arch/arm/boot/下生成bzImage

     

    动态加载:直接编译成PCX86的内核模块

    1)模块加载函数:insmod ;模块卸载函数:rmmod;查看模块函数:lsmod

    2)模块可选信息:模块参数、模块导出符号、模块作者等信息声明

    3)在/work里面加入hello.c文件和Makefile文件

    Makefile的内容为:

    ifneq ($(KERNELRELEASE),)

    obj-m :=hello.o       ####和要编译的模块的名字一致

    else

    KDIR:= /lib/modules/3.5.0-17-generic/build   

    ######以便寻找内核源码目录下的Mmakefile

     

    all:

        make -C $(KDIR) M=$(PWD)modules  

    ######KDIR目录下的Makefile来编译当前目录下的模块

     

    clean:

        rm -f *.ko *.o *.mod.o *.mod.c.symvers

    endif

     

     

    4)执行make 命令

     


    5)、然后查看hello文件夹生成hello.ko文件


    6)执行insmod hello.ko进行加载模块:

     

    7lsmod查看模块查看加载模块输出信息

     



    8)删除rmmod模块

     

    9)查看删除模块输出信息

     
     


    10)这样,就完成了对模块的添加和删除。

     

    总结:

    通过对Linux内核模块的添加和删除实验,我学会了关于内核添加和删除的很多相关知识,首先,把组件编译进内核中,如果建立的一个文件夹,需要使建立的文件夹里的KconfigMakefile生效,需要在上一级目录里修改KconfigMakefile,这样才能使新建立的KconfigMakefile 生效。其次,在模块动态加载到内核过程中,常常会出现不成功的时候,通过问老师,知道了是版本的问题,使得模块加载不成功。我会在以后的学习过程中,加强这方面的学习,提高这方面的技能,让自己所学得到运用。

 

你可能感兴趣的:(Linux)