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
- linux 模块的编译和加载
- Linux内核模块的编译、加载和卸载
- Linux 内核编译步骤和模块加载
- linux 编译和加载卸载模块
- linux模块编译与加载
- Andorid linux模块编译和加载(一)
- Andorid linux模块编译和加载(二)
- Andorid linux模块编译和加载(三)
- Linux内核编译,内核模块编译加载
- Linux 2.6内核下编译可以加载的内核模块
- Linux 2.6内核的编译步骤及模块动态加载
- Linux 2.6内核的编译步骤及模块动态加载
- Linux 2.6内核下编译可以加载的内核模块
- linux内核驱动模块的编译及加载
- linux内核驱动模块的编译及加载
- 简单的Linux 驱动模块编译,加载过程
- Linux内核如何加载编译进内核的模块
- Linux 内核的编译步骤及模块动态加载
- kernel initrd & ramfs
- 图像拼接(一):柱面投影+模板匹配+渐入渐出融合
- 【工作中学到的小技巧】 stringstream
- bootstrap——css样式(一、栅格系统)
- zTree -- jQuery tree plug-ins 学习笔记
- linux 模块的编译和加载
- CDN笔记
- VS2010下编译的库在VC6下使用问题
- 局域网内远程桌面连接
- 《Linux设备驱动开发详解》学习笔记 -- 同步与异步控制
- ARM交叉编译工具链 gnueabi、none-eabi、arm-eabi、gnueabihf、gnueabi区别
- 设计模式——概括
- EventBus(Guava)
- 安装.net framework 3.5时遇到的梗