扫一扫
关注微信公众号

概述Linux系统的驱动框架及驱动加载
2007-07-28   网络

系统初始化过程驱动程序的安装

在Linux安装过程中,系统上的硬件会被检测,基于检测到的结果安装程序会决定哪些模块需要在引导时被载入。Red Hat的安装程序为anaconda,它提供了自动检测硬件,并且安装的机制。

但是,如果计算机内的某些硬件没有默认的驱动程序,比如一块SCSI卡,我们可以在启动后的boot提示符下,输入“linux dd”,在加载完内核后,系统会自动提示插入驱动盘,这时就有机会把该硬件的Linux驱动程序装入。

如果在安装系统时,某种硬件总是因为中断冲突(ISA总线的设备较常见,比如一块ISA网卡)没法正常驱动,或者是缺少驱动程序,那么可以在boot提示符下输入“linux noprobe”。在这种模式下,安装程序不会自动配置找到的硬件,可以自己来选择现有驱动,配置驱动程序的参数,或者选择用光盘或软盘加载驱动程序。

定制引导盘

系统启动时是如何加载驱动的?下面让我们来看一下Red Hat的安装光盘是怎样引导的。当Linux安装光盘启动时,加载位于光盘上isolinux中的内核文件vmlinuz,内核运行完毕后,又将initrd.img的虚拟文件系统加载到内存中。这个文件为ext2文件系统的镜像,经过gzip压缩,可以通过以下步骤查看该镜像中的内容:

# mount /mnt/cdrom
# mkdir /mnt/imgdir
# gunzip < /mnt/cdrom/isolinux/initrd.img > /ext2img
# mount -t ext2 -o loop /ext2img /mnt/imgdir
# cd /mnt/imgdir
# ls -F
bin@
dev/
etc/
linuxrc@
lost+found/
modules/
proc/
sbin/
tmp/
var/
# cd modules
# ls 
module-info
modules.cgz
modules.dep
modules.pcimap
pcitable

其中modules.dep为模块的注册文件,同时有各种模块的依存关系。modules.cgz为cpio的打包文件,实际的各种驱动模块就在该文件中。我们可以通过以下命令解包:

# cpio -idmv < modules.cgz

由此可以看到,解包出来的目录2.4.21-4XXX。进入该目录下的i386目录,就可以看到当前启动盘中支持的所以驱动程序:

# ls 
3c59x.o
3w-xxxx.o
8139cp.o
8139too.o
8390.o
aacraid.o
acenic.o
aic79xx.o
……

若希望在系统中加入需要的驱动程序,可以相应地修改这些文件,比如在modules.dep中加入该模块的名字和依存关系,将编译好的驱动模块文件加入modules.cgz中,这样就可以制定自己的安装光盘。

硬盘上的系统启动过程与上面类似,但是initrd的镜像文件要更简单些,一般在initrd-2.4.XXX.img的虚拟文件系统中,只会在/lib目录下包含ext3.o jbd.o lvm-mod.o等少数文件,用来驱动硬盘上的ext3的文件系统。加载文件系统后,就可以使用/lib/modules/2.4.XXX/下的modules.dep文件及Kernel目录中的各种驱动文件。

热词搜索:

上一篇:概述Linux系统的驱动框架及驱动加载3
下一篇:Linux内核模块是如何被调入内核工作的?

分享到: 收藏