核心和核心模块

本文介绍了Linux内核模块的存放位置及管理方式,包括核心模块的位置、核心代码所在目录、模块依赖性的记录文件等内容,并详细解释了depmod、lsmod、modinfo、insmod、rmmod及modprobe等命令的用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

核心模块就是计算机设备的驱动程序。为了能被核心读取,我们需要把硬件驱动程序“模块化”,并把它放到指定的路径中。

 

核心在哪里?

/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的记录,解决了依赖性的问题。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值