Linux下编写和加载 .ko 文件(驱动模块文件

Linux下编写和加载 .ko 文件(驱动模块文件,第1张

一、.ko 文件介绍

.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。

为搞清楚如何在系统启动时自动加载模块,搜索了好久,网上有很多人提出这个问题,但都没有正确的答案。大家的回答都没有讲到点子上,无非是围绕modprobe.conf、modprobe讲来讲去的,要不就是针对特定问题尝试不同的方法。有的还建议把modprobe modulename写入rc.local,却不曾想rc.local的执行被放在整个启动顺序的很后面,而启动init.d下面定义的服务却在rc.local前面,那么如果某个服务要用这个模块,就不行了。 在测试LVS时,因为我的Fedora7的Kernel(2.6.21-1)缺省没有加载ip_vs模块,而内核中已经包含编译好的IPVS相关的模块了,放在:/lib/modules/2.6.21-1.3194.fc7/kernel/net/ipv4/ipvs/下面,有: /lib/modules/2.6.21-1.3194.fc7/kernel/net/ipv4/ipvs/ip_vs.ko /lib/modules/2.6.21-1.3194.fc7/kernel/net/ipv4/ipvs/ip_vs_dh.ko /lib/modules/2.6.21-1.3194.fc7/kernel/net/ipv4/ipvs/ip_vs_ftp.ko /lib/modules/2.6.21-1.3194.fc7/kernel/net/ipv4/ipvs/ip_vs_lblc.ko /lib/modules/2.6.21-1.3194.fc7/kernel/net/ipv4/ipvs/ip_vs_lblcr.ko /lib/modules/2.6.21-1.3194.fc7/kernel/net/ipv4/ipvs/ip_vs_lc.ko /lib/modules/2.6.21-1.3194.fc7/kernel/net/ipv4/ipvs/ip_vs_nq.ko /lib/modules/2.6.21-1.3194.fc7/kernel/net/ipv4/ipvs/ip_vs_rr.ko /lib/modules/2.6.21-1.3194.fc7/kernel/net/ipv4/ipvs/ip_vs_sed.ko /lib/modules/2.6.21-1.3194.fc7/kernel/net/ipv4/ipvs/ip_vs_sh.ko /lib/modules/2.6.21-1.3194.fc7/kernel/net/ipv4/ipvs/ip_vs_wlc.ko /lib/modules/2.6.21-1.3194.fc7/kernel/net/ipv4/ipvs/ip_vs_wrr.ko 其中ip_vs.ko是IPVS的基本模块,不加载IPVS就不能工作(运行ipvsadm会报错的),而其他的都是IPVS的调度算法或特定协议的辅助模块,需要时则须加载。 要了解如何在系统启动时自动加载模块(Automatically load kernel modules),就得先了解系统是如何启动的,启动的过程中按什么顺序做了什么,怎么做的,这些启动 *** 作都有那些文件和脚本控制。整个开机流程是: (1) 载入BIOS的硬件信息,并取得第一个开机装置的代号 (2)读取第一个开机装置的MBR的boot Loader (grub)的开机信息 (3)载入OS Kernel信息,解压Kernel,尝试驱动硬件 (4) Kernel执行init程序并获得run-lebel信息(如3或5) (5) init执行/etc/rc.d/rc.sysinit (6)启动内核外挂模块(/etc/modprobe.conf) (7) init执行run-level的各种Scripts,启动服务 (8) init执行/etc/rc.d/rc.local (9)执行/bin/login,等待用户Login (10)Login后进入Shell看来正确的方式是把需要加载的模块放在(5)或(6),我修改了/etc/rc.d/rc.sysinit就成功加载了。初步尝试在rc.sysinit最后增加 modprobe.conf ip_vs,重启后lsmod | grep ip_vs,发现成功自动加载了。于是仿效rc.sysinit中其他模块的加载方法,扩展改脚本文件,在最后增加下来一段: # load LVS IPVS modules if [ -d /lib/modules/$unamer/kernel/net/ipv4/ipvs ]then for module in /lib/modules/$unamer/kernel/net/ipv4/ipvs/* do module=${module##*/} module=${module%.ko} modprobe $module >/dev/null 2>&1 done fi就把/lib/modules/2.6.21-1.3194.fc7/kernel/net/ipv4/ipvs/下的所有模块都自动加载。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/9025651.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-24
下一篇 2023-04-24

发表评论

登录后才能评论

评论列表(0条)

保存