编译动态的模块加载
为主机编译模块
要编译的模块文件==》hello.c文件:「摘自linux kernel development」
/*
* hello.c - The Hello, World! Kernel Module
*/
#include
#include
#include
/*
* hello-init - the init function, called when the module is loaded.
* Return zero if successfully loaded, nonzero otherwise.
*/
static int hello_init(void)
{
printk(KERN_ALERT "I bear a charmed life.
");
return 0;
}
/*
* hello_exit - the exit function, called when the module is removed.
*/
static void hello_exit (void)
{
printk(KERN_ALERT "Out, out, brief candle!
");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Shakespeare");
MODULE_DESCRIPTION("A Hello, world Module");
Makefile文件:「摘自linux device driver」
# If KERNELRELEASE is defined, we've been invoked from the
# kernel build system and can use its language.
ifneq ($(KERNELRELEASE),)
obj-m := hello.o
# Otherwise we were called directly from the command
# line; invoke the kernel build system.
else
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
#第一中找内核路径方法
#KERNELDIR ?= /usr/src/"linux-headers-$(shell uname -r)" #第二种找内核路径的方法,实质也是前一种方法的链接
PWD := $(shell pwd)
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
#此处巧妙的运用了 “-C” 实现了二次调用Makefile,注意make前要有”tab“按键
modules_install:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
clean:
$(MAKE) -C $(KERNELDIR) M=$(PWD) clean
endif
调试命令: 1238 make
1239 sudo insmod hello.ko #加载模块
1240 dmesg |grep charm #查看模块输出信息
1241 sudo rmmod hello.ko #卸载模块
1243 dmesg | tail -n 3 #查看卸载模块信息
查看模块信息:wiwa@tech:~/sourcecodes/kernel/drivers/char/fishing$ modinfo hello.ko
filename: /home/wiwa/sourcecodes/kernel/drivers/char/fishing/hello.ko
description: A Hello, world Module
author: Shakespeare
license: GPL
srcversion: 1AE41B6A73B1ED6874F5359
depends:
vermagic: 3.13.0-74-generic SMP mod_unload modversions
进阶模块安装:
wiwa@tech:~/sourcecodes/kernel/drivers/char/fishing$ sudo make modules_install #模块安装
wiwa@tech:~/sourcecodes/kernel/drivers/char/fishing$ sudo depmod #更新模块依赖表
wiwa@tech:~/sourcecodes/kernel/drivers/char/fishing$ cat /lib/modules/$(uname -r)/modules.dep | tail -n 3 #查看模块依赖表
#多了hello.ko模块
kernel/lib/percpu_test.ko:
extra/hello.ko:
extra/fishing.ko:
wiwa@tech:~/sourcecodes/kernel/drivers/char/fishing$ ls -l /lib/modules/$(uname -r)/extra #查看 多了hell.ko文件
total 8
-rw-r--r-- 1 root root 3816 1月 9 18:06 fishing.ko
-rw-r--r-- 1 root root 3812 1月 10 16:21 hello.ko
wiwa@tech:~/sourcecodes/kernel/drivers/char/fishing$ sudo modprobe hello #用modprobe加载hello模块
wiwa@tech:~/sourcecodes/kernel/drivers/char/fishing$ sudo modprobe -r hello #移除hello模块
交叉模块编译:
在嵌入式中,宿主机可以为目标板编译模块
编译交叉模块修改Makefile文件为:「摘自linux device driver」
ARCH=arm
CROSS_COMPILE=arm-linux-gnueabihf-
INSTALL_MOD_PATH=/media/wiwa/sys #此处为目标板的系统文件根目录
# If KERNELRELEASE is defined, we've been invoked from the# kernel build system and can use its language.
ifneq ($(KERNELRELEASE),)
obj-m := hello.o
# Otherwise we were called directly from the command# line; invoke the kernel build system.
else
KERNELDIR ?= ~/sourcecodes/kernel # ~/sourcecodes/kernel 为目标板linux内核文件夹位置
PWD := $(shell pwd)
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules #此处巧妙的运用了 “-C” 实现了二次调用Makefile,注意make前要有”tab“按键
modules_install:
#$(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
clean:
$(MAKE) -C $(KERNELDIR) M=$(PWD) clean
endif
切换到模块所在目录下,执行以下操作:
wiwa@tech:~/sourcecodes/kernel/drivers/char/fishing$ make
## fishing为需要编译的模块文件放置的目录,此处依旧编译上述的“Hello.c”文件
在完成上-步后,可以将编译好的模hello.ko块,拷贝到目标板上执行insmod或rmmod指令。