首 页 » 软件使用 » 关于linux的驱动模块

关于linux的驱动模块

[ 2015-03-28 17:35 | 浏览次数: 1,576次 | 0条评论 ]

模块概念

linux驱动模块就是驱动文件(linux中一般不叫驱动,叫模块,以下文中的驱动,驱动模块,模块都是代表同一样东西),类似于windows的sys文件.

驱动模块是用来操作硬件设备,比如鼠标, 应用程序要获取鼠标当前位置, 需要通过以下调用过程: 应用程序->系统内核->驱动模块->获取鼠标位置.

驱动模块代码在内核运行, 操作的是物理内存(不像应用程序操作的是虚拟内存), 所以驱动需要写得好, 如果访问不正确指针就会导致死机(windows就是蓝屏), (应用程序访问不正确指针只会程序挂掉,对系统没影响).

内部模块

当然linux的某些驱动会编译进内核,这时候是默认启动,并且无法查看,无法禁用.

如果想查看当前系统编译了哪些驱动进入内核,可以查看内核配置文件(如果有的话):

/boot/config-<version>或/usr/src/-headers-<version>/.config或/proc/config.gz

外部模块

windows驱动文件一般放在c:\Windows\System32\drivers\,以sys为后缀, linux的驱动文件一般放在/lib//XXX/kernel, XXX表示当前系统的版本号,以ko为后缀.

模块相关命令(只试用于外部模块,就是没有编译进内核的模块):

  列出当前系统加载的所有模块, 其实就是去读取并解析/pro/modules文件,这里可以看到模块当前使用量

<模块名>  加载模块到内核, 此模块名必须在/lib/modules/<version>/modules.dep出现, 模块名不包括后缀

modprobe -r <模块名>  从内核卸载模块, 此模块名必须在/lib/modules/<version>/modules.dep出现, 模块名不包括后缀

modinfo <模块名>  查看模块信息,这个模块名如果不带后缀,则要求和modprobe一样, 如果带有后缀则不在modules.dep查找,直接根据路径打开并输出模块信息

如果在开发模块, 可以使用以下命令来加载和卸载.

  <模块名> 加载模块到内核, 此模块名就是文件路径

  <模块名>  从内核卸载模块,此模块名不需要后缀,只要文件基本名

模块开发好后,应该将模块复制到/lib/modules/<version>/kernel,然后通过命令depmod来更新modules.dep文件,depmod命令会搜寻/lib/modules/<version>/kernel下所有的模块,然后把模块信息写入/lib/modules/<version>/modules.dep

注:以上命令除了lsmod和modinfo外都需要root权限

外部模块加载时机

外部模块不像内部模块, 它需要去加载, 加载方式有三种:

1. 系统启动时自动加载   

这个就是在启动文件里写上上面的加载模块命令,比如modprobe 某某模块.

启动文件在哪请参考你的启动程序,linux一般称为init, 目前有几个不同的init程序, 每个都不一样.

2.手动加载

就是在程序里手动运行这些命令,当然需要root权限, 比如运行mout就会自动加载某些模块

3. 根据设备插入事件加载

就是在找到设备时加载模块,比如usb设备插入就加载usb模块

具体如何实施请参考udev(这个就是监视外部设备并执行你的插入模块命令的程序)

您可以任意转载本文,但转载时请勿删除作者信息。
作者:hgyxbll,原文链接:http://shashanzhao.com/archives/1130.html
上一篇: | 下一篇:

沙发为空,还不快枪?[点此发言]

目前还没有任何评论.