内核模块是如何被调入内核工作的
时间:2006-11-08 来源:适兕
因为单位配的本本无线网卡驱动总是加载不上,在man modprob.conf之后,并参照现有的系统的这个文件,编辑/etc/modprobe.conf文件导致系统启动不能加载所有的module.折腾了近两三个小时,在同事的帮助下终于解决了问题,当然只是恢复到原来的状态,并发现ipw2200无线网卡驱动确实在启动时有本文开头提到的毛病,必须在系统启动之后,rmmod,然后再modprobe.这可能是驱动本身的问题。报错如下:
ipw2200 device eth1 does not seem to be present, delaying initialization.
ipw2200 设备 eth1 似乎不在。将要推迟它的初始化。
过几天查看http://ipw2200.sourceforge.net/的详细信息之后再说吧,今天就将折腾模块的过程记录下来:
由于驱动模块不能加载,所以鼠标不能用,也认识了其他的一些驱动。。
首先查看自己的系统内核版本:uname -r
下载相应的内核包,或源代码。。。
cd /lib/modules/'uname -r'/kernel/drivers/*
lspci
inmod xxx.ko.
此时,modprobe xxx.ko大多不可能成功,这里我就说一下inmod和modprobe的区别:
执行lsmod命令来查看内核已经加载了哪 些内核模块, 该命令通过读取/proc/modules文件的内容 来获得所需信息。
原理就是这样,是同事的一个depmod的提醒救了我,这让我感受到了团队的重要性,交流,以及工作在一群有共同爱好的人中间,提高是与日俱增的。
另外一个教训就是一定要查看 /var/log/*下的内容,类似这样可以启动系统,不能启动模块的东西,进入交互模式启动是一个不错的主意。
还有就是发现了一个服务脚本/etc/init.d/microcode_ctl,就google了一下:连接如下http://www.urbanmyth.org/microcode/,因为是英文不是很理解。
本文参考文章:http://dirac.org/linux/writing/lkmpg/2.6/chinese/lkmpg_chs/x50.html
ipw2200 device eth1 does not seem to be present, delaying initialization.
ipw2200 设备 eth1 似乎不在。将要推迟它的初始化。
过几天查看http://ipw2200.sourceforge.net/的详细信息之后再说吧,今天就将折腾模块的过程记录下来:
由于驱动模块不能加载,所以鼠标不能用,也认识了其他的一些驱动。。
首先查看自己的系统内核版本:uname -r
下载相应的内核包,或源代码。。。
cd /lib/modules/'uname -r'/kernel/drivers/*
lspci
inmod xxx.ko.
此时,modprobe xxx.ko大多不可能成功,这里我就说一下inmod和modprobe的区别:
执行lsmod命令来查看内核已经加载了哪 些内核模块, 该命令通过读取/proc/modules文件的内容 来获得所需信息。
这些内核模块是如何被调入内核的?当操作系统内核需要的扩展功能不存 在时,内核模块管理守护进程kmod执行modprobe去加载内核模 块。两种类型的参数被传递给modprobe:
-
一个内核模块的名字像softdog或是ppp。
-
通用识别符像char-major-10-30。
当传递给modprobe是通用识别符时,modprobe首先在文件 /etc/modules.conf查找该字符串。如果它发现的一行别名像:
alias char-major-10-30 softdog
它就明白通用识别符是指向内核模块softdog.o。
然后,modprobe遍历文件/lib/modules/version/modules.dep 来判断是否有其它内核模块需要在该模块加载前被加载。该文件是由命令depmod -a 建立,保存着内核模块的依赖关系。举例来说,msdos.o依赖于模块fat.o 内核模块已经被内核载入。当要加载的内核模块需要使用别的模块提供的符号链接时(多半是变量或函数), 那么那些提供这些所需符号链接的内核模块就被该模块所依赖。
最终,modprobe调用insmod先加载被依赖的模块,然后加载该被内核要求的模块。modprobe将insmod指向 /lib/modules/version/目录,该目录为默认标准存放内核模块的目录。insmod对内核模块存放位置 的处理相当呆板,所以modprobe应该很清楚的知道默认标准的内核模块存放的位置。所以,当你想要载入一个内 核模块时,你可以执行:
insmod /lib/modules/2.5.1/kernel/fs/fat/fat.o
insmod /lib/modules/2.5.1/kernel/fs/msdos/msdos.o
或只是执行"modprobe -a msdos"。
Linux提供modprobe, insmod and depmod在一个名为modutils 或 mod-utils的工具包内。原理就是这样,是同事的一个depmod的提醒救了我,这让我感受到了团队的重要性,交流,以及工作在一群有共同爱好的人中间,提高是与日俱增的。
另外一个教训就是一定要查看 /var/log/*下的内容,类似这样可以启动系统,不能启动模块的东西,进入交互模式启动是一个不错的主意。
还有就是发现了一个服务脚本/etc/init.d/microcode_ctl,就google了一下:连接如下http://www.urbanmyth.org/microcode/,因为是英文不是很理解。
本文参考文章:http://dirac.org/linux/writing/lkmpg/2.6/chinese/lkmpg_chs/x50.html
相关阅读 更多 +