核心模块就是计算机设备的驱动程序。为了能被核心读取,我们需要把硬件驱动程序“模块化”,并把它放到指定的路径中。
核心在哪里?
/boot/vmlinuz-2.6.28-11-generic (以Ubuntu为例)
核心模块(驱动程序)在哪里?
/lib/modules/`uname -r`/kernel
核心代码在哪里?
/usr/src/linux
核心的版本信息在哪里?
/proc/version
在/lib/modules/`uname -r`/kernel中,还有很多的子目录。
1) arch:与硬件平台有关的项目,例如CPU的等级等
2) crypto:核心所支持的加密技术,例如MD5或者des等
3) drivers:一些硬件的驱动程序,如显卡、网卡、PCI相关硬件等
4) fs:核心所支持的文件系统,如vfat、reiserfs、nfs等
5) lib:一些函数库
6) net:与网络有关的各项协议数据,还有防火墙(net/ipv4/netfilter/*)等
7) sound:与音效有关的各模块
模块之间的依赖性记录在文件/lib/modules/`uname -r`/modules.rep中,下例为文件中的某一行。
kernel/net/netfilter/nf_conntrack_tftp.ko: kernel/net/netfilter/nf_conntrack.ko
上面表示模块nf_conntrack_tftp.ko依赖于模块nf_conntrack.ko。
* depmod 命令
使用depmod可以建立这个文件。也就是如果新安装了一个模块,可以使用如下的命令,把它写入modules.dep中。
depmod -a # 对所有模块进行重新的分析工作,并建立modules.dep
* lsmod命令
用来观察模块,就是看看当前系统中存在的所有模块
Module Size Used by
binfmt_misc 16776 1
bridge 56340 0
stp 0500 1 bridge
bnep 20224 2
input_polldev 11912 0
video 25360 0
output 11008 1 video
......
它的输出有三个域,第一个域是模块的名称,第二域是模块的大小,最后一个域是模块是否被其他模块使用。
* modinfo命令
查看每个模块的信息。下面是模块pcnet32的信息。
root@flagonxia-desktop:/lib/modules/2.6.28-11-generic# modinfo pcnet32
filename: /lib/modules/2.6.28-11-generic/kernel/drivers/net/pcnet32.ko
license: GPL
description: Driver for PCnet32 and PCnetPCI based ethercards
author: Thomas Bogendoerfer
srcversion: 261B01C36AC94382ED8D984
alias: pci:v00001023d00002000sv*sd*bc02sc00i*
alias: pci:v00001022d00002000sv*sd*bc*sc*i*
alias: pci:v00001022d00002001sv*sd*bc*sc*i*
depends: mii
vermagic: 2.6.28-11-generic SMP mod_unload modversions 586
parm: debug:pcnet32 debug level (int)
parm: max_interrupt_work:pcnet32 maximum events handled per interrupt (int)
parm: rx_copybreak:pcnet32 copy breakpoint for copy-only-tiny-frames (int)
parm: tx_start_pt:pcnet32 transmit start point (0-3) (int)
parm: pcnet32vlb:pcnet32 Vesa local bus (VLB) support (0/1) (int)
parm: options:pcnet32 initial option setting(s) (0-15) (array of int)
parm: full_duplex:pcnet32 full duplex setting(s) (1) (array of int)
parm: homepna:pcnet32 mode for 79C978 cards (1 for HomePNA, 0 for Ethernet, default Ethernet (array of int)
* insmod 命令
手动加载某个模块,完全由用户自行加载一个完整文件名的模块,并不会主动地分析模块的依赖性。
例子:
第一步:检查内核中有没有smbfs模块
#lsmod | grep smbfs
第二步:加载该模块
#insmod /lib/modules/`uname -r`/kernel/fs/smbfs/smbfs.ko
第三步:验证内核里是否已经加载了改模块
#lsmod | grep smbfs
smbfs 67897 0
* rmmod 命令
删除模块,如:rmmod smbfs。
* modprobe命令
参数:
-c: 列出当前系统的所有的模块
-l: 列出当前在/lib/modules/`uname -r`/kernel/中的所有模块的完整文件名
-f: 强制加载该模块
-r: 删除该模块
例:
# modprobe smbfs
# modprobe smbfs
可见,执行modprobe时,无需给出模块的详细地址。而且,它的一个重要的优点是,它直接去搜索modules.dep的记录,解决了依赖性的问题。