linux 模块的编译和加载

来源:互联网 发布:java让代码只执行一次 编辑:程序博客网 时间:2024/06/09 11:09

一个最简单的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的话)

0 0
原创粉丝点击