Makefile:
# 如果已定义KERNELRELEASE , 则说明是从内核构造系统调用的 # 因此可利用其内建语句 ifneq ($(KERNELRELEASE), ) obj-m := hello.o # 否则,是直接从命令行调用的, # 这时,要从内核构造文件系统。 else KERNELDIR ?= /home/linux/Desktop/samba/linux-2.6.30.4 PWD := $(shell pwd) default: $(MAKE) -C $(KERNELDIR) M=$(PWD) modules clean: rm *.ko *.mod.* *.o modules.* Module.* endif
hello.c:
#include <linux/init.h> #include <linux/module.h> MODULE_LICENSE("Dual BSD/GPL"); static int hello_init(void) { printk(KERN_ALERT "Hello, World!\n"); return 0; } static void hello_exit(void) { printk(KERN_ALERT "Goodbye, cruel world!\n"); } module_init(hello_init); module_exit(hello_exit);
运行:
[root@(none)/]#insmod hello.ko Hello, World! [root@(none)/]#rmmod hello.ko rmmod: chdir(/lib/modules): No such file or directory [root@(none)/]#
在/lib/目录下创建modules目录:
cd /lib mkdir modules
再次运行rmmod:
[root@(none)/]#rmmod hello rmmod: chdir(2.6.30.4-EmbedSky): No such file or directory
查资料:
创建/lib/modules/2.6.30.4-EmbedSky目录
把hello.ko拷贝到该目录
卸载:
[root@(none)/]#rmmod hello Goodbye, cruel world!
再验证,将该目录下的hello.ko删除,再次测试:
[root@(none)/]#insmod hello.ko Hello, World! [root@(none)/]#rmmod hello Goodbye, cruel world!
还是可以的,说明关键是要存在/lib/modules/2.6.30.4-EmbedSky这个目录