Tuesday, September 22, 2009

Linux kernel module(LKM)管理

学习linux下的module机制, 方便管理

module与文件的路径

linux module放置的路径为/lib/modules/version
* version为kernel的版本, 如# uname -r
module文件名都是以ko结尾的.
* 2.4之前为 .o 结尾

如果安装了bash-completion你就会发现
# modprobe <tab><tab>
列出的module数目与
# find /lib/modules/version -name *.ko
是一样的, 也可以使用
# modprobe -l

module的CLI管理工具

jessinio@niolaptop /etc $ equery belongs modprobe
 * Searching for modprobe ...
sys-apps/module-init-tools-3.5 (/sbin/modprobe)
* 之前的管理工具叫modutils

具体工具名单:
jessinio@niolaptop /etc $ equery files sys-apps/module-init-tools|grep bin
/bin
/bin/lsmod
/sbin
/sbin/depmod
/sbin/generate-modprobe.conf
/sbin/insmod
/sbin/insmod.static
/sbin/lsmod
/sbin/modinfo
/sbin/modprobe
/sbin/rmmod
/sbin/update-modules

module-init-tools工具配置文件

modprobe的配置文件:
1. /etc/modprobe.conf
2. /etc/modprobe.d
2.4前的modutils使用的配置文件(现在还保留):
1. /etc/modules.conf
2. /etc/modules.d

linux distro在启动时有一个加载module的脚本: /etc/init.d/modules
调用的配置文件为(man 5modules.autoload) :
1. /etc/modules.autoload
2. /etc/modules.d
* 这些文件属于sys-apps/baselayout包

kernel信息文件:
/proc/kallsyms: kernel space中的symbol, 包括变量到函数. system call就在其中!
/proc/modules: 加载的module列表.

kernel module loader

中文称之为加载器. 这部分变化几次. 有两个版本:
1. 2.2前, 使用的module loader为kerneld, 这一个daemon程序. 这方面的资料地址
2. 2.4后, 被集成kernel中, 内核配置需要CONFIG_KMOD
KMOD在2.6.28后就不需要
http://cateee.net/lkddb/web-lkddb/KMOD.html

module loader的源代码于:linux-source/kernel/kmod.c
module loader代码中默认会使用modprobe, 用户也可以动态修改: /proc/sys/kernel/modprobe
kmod.c提供了加载module的处理API, 如: request_module(bool wait, const char *name, ...)
这实现了一个module可以加载另一个module的方法

加载module

参数:
insmod ne.o io=0x300 irq=11
每个module都没有统一的参数, 需要参考module的文档
对于使用modprobe命令去加载的module, 它们的参数可以写到配置文件/etc/modprobe.conf和/etc/modprobe.d/*中

依赖关系:
平时我们都喜欢使用modprobe命令而不是使用insmod, 因为modprobe解决了module之间的依赖. 其实, modprobe需要依赖于depmod命令产生的modules.dep文件
. 此文件默认路径: /lib/modules/version/module.dep
* man module.dep

Alias

# modprobe name
其实name不一定是module的名字, 可以是alias

用处:
1. 应用层统一. 比如使用eth0去表示第一块网卡, 而不要去理会实际使用的module名的差异.
* ALSA的一个例子: http://alsa.opensrc.org/index.php/Setting_up_modprobe_and_kmod_support

常用的alias: http://svn.exactcode.de/t2/trunk/package/base/module-init-tools/modprobe.conf.data
还有这样的用法:
http://www.ducea.com/2006/06/01/disable-ipv6-module-on-default-kernels/

自己写的一篇alia方面的文章: http://blog.jessinio.info/2009/09/modulealias.html

automatic load

1. 在系统启动时自动加载module, 涉及的:
/etc/init.d/modules
/etc/modules.autoload

2. 在系统需要使用modules功能时, 会调用来自kernel/kmod.c的request_module(bool wait, const char *name, ...)函数.

module的加载过程



参考文档:
http://tldp.org/HOWTO/Module-HOWTO/
http://tldp.org/LDP/lkmpg/2.6/html/x44.html

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.