一个最简单的linux模块
//头文件
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("CAN");
int test_module_init()
{
printk("module init\n");
return 0;
}
void test_module_exit()
{
printk("module exit\n");
}
module_init(test_module_init);
module_exit(test_module_exit);
当系统调用insmod的时候将执行module_init函数,rmmod 模块卸载时调用module_exit函数,所有模块都需包含上述头文件,设备驱动模型的代码须指定为GPL协议,否则无法加载到内核中。
Makefile:
obj-m := test_module.o
KDIR :=/home/can/tiny4412/linux-3.8 # arm
all:
make -C $(KDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-linux-
clean:
rm -f *.ko *.o *.mod.o *.mod.c *.symvers modul* *oper
编译的三种情况:
obj-不编入内核
obj -y编入内核
obj-m编译成模块
执行make编译后将生成的.ko文件拷贝到开发板 进入目录执行 insmod与rmmod 加载与卸载该模块
insmod 模块.ko 参数1=值1 参数2=值2 参数3=值3
modprobe 命令是比较高级的加载和删除模块命令,其可以解决模块之间的依赖性问题
lsmod 命令列出已经加载的模块和信息。在insmod hello.ko 之前和之后执行该命令可知道hello.ko是否被加载
modinfo 命令用于查询模块的相关信息,比如作者 、版权等
在加载hello.ko后文件系统发生的变化
/proc/modules发生变化 查看该文件将发现 多了一行信息分别表示 模块名 使用的内存、引用计数(该模块被多少个程序使用) 分隔符和加载到内核的地址
查看包含he*信息的命令cat modules | grep he*
/proc/devices 文件无变化 因为hello.ko不是一个设备模块,设备模块需要在模块中新建一个设备文件
在/sys/module/目录增加一个hello目录 使用tree -a hello可看到该目录树(如果你有安装tree的话)