#include
#static int nbr =2;
#module_param(nbr, int, S_IRUGO)
void hello(void)
{
printk(KERN_DEBUG "[kernel space] begin kernel_receive\n");
}
int __init hello_init(void)
{
hello();
}
void __exit hello_exit(void)
{
printk(KERN_DEBUG "test_netlink_exit!!\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("xiahzp@hdu");
#MODULE_DESCRIPTION(模块用途的简单描述);
#MODULE_VERSION(模块的版本字符串);
#MODULE_ALIAS(模块的别名);
源文件编辑好后,可以写一个Makefile 用来编译模块
Makefile:
obj-m += hello.o #module name
modules-objs:=hello.o #obj files need to make module
KDIR := /lib/modules/`uname -r`/build
PWD :=$(shell pwd)
default:
make -C $(KDIR) M=$(PWD) modules
clean
rm -rf *.o *.cmd *.ko *.mod.c .tmp_versions
插入模块:insmod
卸载模块:rmmod
查看信息: dmesg | tail -12
查看可用参数: ls /sys/module/hello/parameters
带参数加载模块:insmod hello.ko nbr=200
显示模块信息: modinfo hello.ko
小结:
在写到module_param(nbr, int, S_IRUGO) 的时候,你应该想到还有:
EXPORT_SYMBOL(name) ; /* 可以导出模块的函数,这也是模块编写的最终目的 */
在用到insmod 和 modinfo 的时候, 你应该想到还有:
depmod /* 分析可加载模块的依赖性,并生成modules.dep文件和映射文件 */
modeprobe /* Linux 内核添加删除模块 */
实际上编译驱动的时候是使用预先提供的一个makefile 的,位置在:
/lib/module/`uname -r`/build/Makefile