Linux内核模块添加的两种方法
-
静态加载:
把组件都添加进内核文件中,在目录kongfig文件中增加新代码对应的编译选项,在Makefile文件中添加编译条目。
-
动态加载:
下载并安装Linux内核模板:
make modules _install ARCH = arm CROSS _COMPILE=arm-linux
编写Makefile。
以hello world为例来实现这两种方法:
静态加载:
(1)hello world.c源代码
#include <linux/init.h>
#include <linux/module.h>
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 <21cnbao@gmail.com>");
MODULE_LICENSE("Dual BSD/GPL");
MODULE_DESCRIPTION("A simple Hello World Module");
MODULE_ALIAS("a simplest module");
把所有的组件都翻译进内核文件,即生成zImage或bzImage
(1)进入linux-2.6.32.2-mini2440内核
(2)进入/drivers建立Hello文件夹,在Hello文件夹里面建立hello.c,Makefile,Kconfig
Makefiel:obj-y(CONFIG_HELLO_WORD) +=hello.o
Kconfig:config 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
动态加载:直接编译成PC机X86的内核模块
(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进行加载模块:(7)lsmod查看模块查看加载模块输出信息
(8)删除rmmod模块(9)查看删除模块输出信息
(10)这样,就完成了对模块的添加和删除。
总结:
通过对Linux内核模块的添加和删除实验,我学会了关于内核添加和删除的很多相关知识,首先,把组件编译进内核中,如果建立的一个文件夹,需要使建立的文件夹里的Kconfig和Makefile生效,需要在上一级目录里修改Kconfig和Makefile,这样才能使新建立的Kconfig和Makefile 生效。其次,在模块动态加载到内核过程中,常常会出现不成功的时候,通过问老师,知道了是版本的问题,使得模块加载不成功。我会在以后的学习过程中,加强这方面的学习,提高这方面的技能,让自己所学得到运用。