linux 模块的编译和加载

这篇博客详细介绍了Linux模块的编译和加载过程,包括`insmod`、`rmmod`、`modprobe`等命令的使用,以及加载模块后系统的变化,如`/proc/modules`和`/sys/module`目录的更新。通过`Makefile`设置编译选项,模块必须遵循GPL协议才能被内核接受。此外,`lsmod`和`modinfo`命令提供了查看已加载模块和其详细信息的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值