本博客原创文章属本人lurker0ster所有,欢迎转载。
转载时需同意以下条件:
1. 必须保持版权信息,以及文章出处http://blog.csdn.net/lurker0ster/
2. 不准演绎,修改,必须完整转载全部内容。
===================分割线====================
Modprobe 是insmod的智能版本。它可以根据依赖关系把目标驱动相关的驱动也一并加载,使用上非常方便,所以有很多linux发行版本采用modprobe做启动时的驱动加载工具。
一般而言,有两个地方决定了modorbe加载驱动的顺序。一处是/lib/modules/<version>/,一处是/etc/modprobe.d/*.conf。前者的作用类似与数据库,后者是控制部分。工具还提供了对旧版本modprobe的配置文件modprobe.conf的兼容,这在GNU工具中是很少见的。
/lib/modules/<version>/modules.dep | 依赖文件;语法很像makefile |
/lib/modules/<version>/modules.alias | 模块的别;格式是(别名,真实名) 可以有多个别名 |
/lib/modules/<version>/modules.symbols | 特定符号对应的模块名 |
这三个文件都有**.bin版本,比如modules.symbols.bin。这个设计主要是设计者考虑到文本搜索效率低而采取的优化措施。
/etc/modprobe.d/*.conf在前面的数据库基础上做了智能控制的部分。有如下功能:
- 1.解决依赖关系
- 2.禁止有问题驱动加载(防止误配置)
- 3.启动时指定各自的参数
4.同时启动额外的程序
5.模块版本控制(别名机制) (比如B依赖A, A有1.4/1.3 或者新版本改名字了这种情况有起作用了)
- *.conf支持几种命令,可以在man modprobe中查到。
alias 别名 options 制定模块每次加载时需要的参数 install 在加载驱动前,加载配套的程序。
install pcnet32 /sbin/modprobe -q --ignore-install vmxnet; /sbin/modprobe --ignore-install pcnet32 $CMDLINE_OPTSinclude 包含依赖关系 blacklist 黑名单 remove 卸载驱动 config 配置modprobe 工作方式。比如config binary_indexs yes -
modprobe是一个独立的工具。每次运行modprobe都得调用parse_toplevel_config函数,扫描一遍/etc/modprobe.d目录下的文件,把modname对应options commands aliases blacklist都分析出来,然后对alias应用blacklist去掉禁止使用的模块。运行时间取决于配置文件以及条目的数量,而且是字符串比较,所以非常地耗时间。
它的缺点在于:
1.使用符号名作为依据,很难维护
2.不能够做到加载并行化(针对没有依赖关系的驱动)
3.每次都扫描,效率很差
针对用户环境不会经常变动的情况,其实我们可以只在正常使用时产生一次驱动的顺序加载列表,然后在下一次启动时调用insmod读取这个顺序表,一次加载对这个驱动。另外,很多驱动没有必要在启动的时候加载,可以在第一次使用的时候加载。就算是有多种硬件环境,也可以使用硬件配置文件的设定来提供这种灵活性,windows正是这么做的。