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

2019-07-13 08:48发布

 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 "); return 0; }   static void hello_exit(void) { printk(KERN_INFO " Hello World exit "); }   module_init(hello_init); module_exit(hello_exit);   MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>"); 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 生效。其次,在模块动态加载到内核过程中,常常会出现不成功的时候,通过问老师,知道了是版本的问题,使得模块加载不成功。我会在以后的学习过程中,加强这方面的学习,提高这方面的技能,让自己所学得到运用。