.ko文件是kernel object文件(内核模块),该文件的意义就是把内核的一些功能移动到内核外边, 需要的时候插入内核,不需要时卸载。
二、优点
(1)这样可以缩小内核体积;
(2)使用方便。
三、.ko文件一般的用处
(1)作为一个功能模块,需要使用时,直接插入运行就行。如在imx6上连接模拟摄像头,先运行模拟摄像头对应的驱动模块 camera.ko文件,然后对应的工程执行文件运行就行。
四、使用.ko 文件
1、加载驱动模块test.ko
(1)方法一
进入test.ko驱动模块文件所在的目录,然后直接 insmod test.ko
(2)方法二
将test.ko文件拷贝到/lib/module/#uname-r#/目录下,这里,#uname -r#意思是,在终端中输入
uname -r后显示的内核版本及名称,例如mini2440中#uname-r#就是2.6.32.2-FriendlyARM。
然后 depmod(会在/lib/modules/#uname -r#/目录下生成modules.dep和modules.dep.bb文件,表明模块的依赖关系)
最后 modprobe test(注意这里无需输入.ko后缀) 即可
注:两伍租种方法的区别
modprobe和insmod类似,都是用来动态加载驱动模块的,区别在于modprobe可以解决load module时的依赖关系,它是通过/lib/modules/#uname -r/modules.dep(.bb)文件来查找依腔做兆赖关系的;而insmod不能解决依赖问题。也就是说,如果你确定你要加载的驱动模块不依赖其他驱动模块的话,既可以insmod也可以modprobe,当然insmod可以在任何目录下执行,更方便一些。而如果你要加载的驱动模块还依赖其他ko驱动模块的话胡厅,就只能将模块拷贝到上述的特定目录,depmod后再modprobe。
不玩这个,这里提供一个思路gcc命令其实是分成陵喊几步执行的,预处理,编逗汪宴译,链接。".o"才到编译这一步,如果按照生成ko文件的方式链接一下说不定能成。
另生成你所说的.o文件的源代码一定是要按".ko"的规范写的,也就是什么模块注册,模块卸载等函数是必需要有的.
想想编译ko里的makefile,里面好像是引入了一个modules目录吧!
呵呵,3楼的方法是普通的链接过程。“.ko”的链接应该不会这么简单!
望楼主山银细心探索
linux内核支持动态加载模块,内核模块以.ko为后缀,在Linux系统中,内核模块放在/lib/modulex/x.x.x目录中,其中x.x.x为linux版本号
加载模块
insmod xxx.ko
如果带参数 insmod xxx.ko a=1
卸载模块
rmmod xxx.ko
支持的数首正据类型
bool :布尔类型
invbool:颠倒了值的bool类型
charp :字符指针类型,内存为用户提供的字符串分配
int:整型
long :长整型
short :短整型
uint :无符号整型
ulong :无符号物芹指长整型
ushort :无符号短整型
内核模块源码Makefile编写格式和linux源码的格式一样
在OpenWrt系统中,内核模块编译和应用层的package编译类似
make package/模块名/compile V=s
比如:
make package/hello_kernel/compile V=s
编译完成后会生成.ko文件,目录文件在build_dir中,但和应用罩配层的build目录有点区别,内核模块的package放在linux目录,如(X86平台):
build_dir/target-x86_64_musl/linux-x86_64/
将编译完成的ko文件传输到OpenWrt系统中,注意编译平台和开发板平台的系统架构要一致。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)