在整个启动过程中,能否成功地启动主机的硬件,是核心的工作。而核心一般都是压缩文件,因此在使用核心之前,就要将核心解压缩后,才能加载到主存储器中。目前的核心都具有“可读取模块化驱动程序”的功能,可以将模块想象成是一个“外挂程序”。下面介绍一些有关内容:
* 核心存放位置:/boot/vmlinuz
* 核心解压缩所需的RAM Disk:/boot/initrd
* 核心模块:/lib/modules/`uname -r`/kernel
* 核心源码:/usr/src/linux(安装才有,默认不安装)
* 系统核心功能:/proc/sys/kernel
如有有一个新硬件,操作系统不支持时,一般采取两种方式:
* 重新编译核心(不容易)
* 将硬件的驱动程序编译为模块,在启动时加载该模块
下面仅说明加载模块的方法
一、核心模块与依赖性
核心放在/lib/modules/`uname -r`/kernel中,里面主要分成几个目录
arch:与硬件平台有关的项目,例如CPU的等级等。
crypto:核心所支持的加密技术,如md5等
drivers:一些硬件的驱动程序
fs:核心所支持的文件系统
lib:一些函数库
net:与网络有关的各项协议数据,还有防火墙模块等
sound:与音效有关的各模块
在Linux系统中提供了/lib/modules/`uname -r`/modules.dep文件用来记录核心支持的模块的各项依赖性。
使用depmod命令就可以建立该文件
[root@redflag ~]# depmod (具体参数使用man来查看)
范例:更新网卡的驱动程序
[root@redflag ~]# cp /full/path/a.ko /lib/modules/`uname -r`/kernel/driver/net
[root@redflag ~]# depmod
二、核心模块的观察:lsmod、modinfo
1. 查询当前系统加载的模块:lsmod
[root@redflag ~]# lsmod Module Size Used by joydev 11841 0 …… ds 21449 0 yenta_socket 22977 0 pcmcia_core 69329 2 ds,yenta_socket dm_mirror 32465 0 …… [root@redflag ~]# |
* 模块名称
* 模块的大小
* 此模块是否被其他模块所用
2. 查看每个模块的信息:modinfo
[root@redflag ~]# modinfo bnx2 filename: /lib/modules/2.6.9-42.ELsmp/kernel/drivers/net/bnx2.ko parm: disable_msi:Disable Message Signaled Interrupt (MSI) version: 1.4.38 E1B1EC867DEEB8027B2DA0F license: GPL description: Broadcom NetXtreme II BCM5706/5708 Driver author: Michael Chan mchan@broadcom.com alias: pci:v000014E4d000016ACsv*sd*bc*sc*i* alias: pci:v000014E4d000016AAsv*sd*bc*sc*i* alias: pci:v000014E4d000016AAsv0000103Csd00003102bc*sc*i* alias: pci:v000014E4d0000164Csv*sd*bc*sc*i* alias: pci:v000014E4d0000164Asv*sd*bc*sc*i* alias: pci:v000014E4d0000164Asv0000103Csd00003106bc*sc*i* alias: pci:v000014E4d0000164Asv0000103Csd00003101bc*sc*i* depends: vermagic: 2.6.9-42.ELsmp SMP gcc-3.4 |
1.完全由用户自行加载一个完整文件名的模块,但不会主动分析模块的依赖性:insmod
范例:加载smbfs.ko模块 [root@redflag ~]# insmod /lib/modules/`uname -r`/kernel/fs/smbfs/smbfs.ko [root@redflag ~]#lsmod | grep smbfs smbfs 67897 0 |
[root@redflag ~]# rmmod [-wf] module_name
参数:
-f:强制将该模块删除
-w:若模块正在使用,那么等待使用完毕后删除
3.加载过程中主动分析模块依赖性:modprobe
目前推荐使用的就是modprobe命令,这是因为modprobe会主动搜索modules.dep的内容,解决了模块的依赖性后,才决定需要加载的模块
[root@redflag ~]# modprobe [-lcf] module_name
参数:
-c:列出当前系统所有的模块
-l:列出当前在/lib/modules/`uname -r`/kernel中的所有模块完整文件名
-f:强制加载该模块
-r:类似rmmod
范例:加载smbfs模块 [root@redflag ~]# modprobe smbfs #不需要知道完整的模块文件名,这是因为该完整文件名已经记录到/lib/modules/`uname -r`/modules.dep中 [root@redflag ~]#modprobe -r smbfs |
转载于:https://blog.51cto.com/fzguon/398158