|
| Linux下设备完全驱动之二(1) |
 |
| 时间:2005-09-25 作者:郄晓烨 来源:赛迪 |
 |
前一节Linux培训园地:Linux下设备完全驱动之一,大家看过之后相信一定印象深刻。这一节首先讲述IDE硬盘及光驱的设置、IDE刻录机的使用,以及如何安装SCSI硬盘驱动。然后介绍以太网卡驱动模块的加载及网络接口的启功过程,如何调整网卡的参数,Modem、ADSL和宽带的驱动安装,以及PPP连接的设置等。
IDE硬盘及光驱
1.IDE设备的驱动过程
操作系统首先是安装在块设备上,没有对块设备的支持系统就无法启动,所以首先介绍常见块设备的安装。硬盘就是最常见的块设备,普通PC上的硬盘通常是IDE接口的,而服务器上的硬盘通常是SCSI接口的。
一般内核中内置对通用IDE控制芯片的支持。下面看一下IDE硬盘在内核中的驱动过程,dmesg命令可以看到内核在启功和加载内核模块时的信息:
在Linux内核启动过程中,可以发现内核首先驱动初始化CPU、内存、系统时钟部分,接着加载PCI总线的驱动,然后就加载了通用的IDE驱动程序:
Uniform Multi-Platform E-IDE driver Revision: 7.00beta4-2.4
|
接着初始化IDE的控制器,IDE控制器集成在Intel的ICH4南桥芯片组中,IDE控制芯片驱动加载后,进行初始化传输模式:
ICH4: chipset revision 1
ICH4: not 100% native mode: will probe irqs later
ide0: BM-DMA at 0xbfa0-0xbfa7, BIOS settings: hda:DMA, hdb:pio
ide1: BM-DMA at 0xbfa8-0xbfaf, BIOS settings: hdc:DMA, hdd:pio
|
该驱动程序会向核心中注册主设备号为3的block型设备。可以看到,在IDE控制器初始化时,占用的I/O资源及分配给它的中断号:
ide0 at 0x1f0-0x1f7,0x3f6 on irq 14
ide1 at 0x170-0x177,0x376 on irq 15
|
接着使用IDE控制器查找连接在IDE接口上的设备,如果检查到硬盘则加载IDE硬盘的驱动程序,设置了该硬盘的基本参数,设置传输方式为UDMA(100),也就是ATA100(100Mb/s的传输速度),并且根据这个驱动程序检测硬盘上的分区:
hda: attached ide-disk driver.
hda: host protected area => 1
hda: 78140160 sectors (40008 MB) w/7898KiB Cache, CHS=4864/255/63, UDMA(100)
ide-floppy driver 0.99.newide
Partition check:
hda: hda1 hda2 hda3 hda4 < hda5 hda6 hda7 hda8 hda9 >
|
/dev/hda代表第一个IDE接口的主设备,它的设备号为block(3/0),而/dev/hda1是这块硬盘的第一个分区,设备编号是 block (3/1);/dev/hdb代表第一个IDE接口的从设备,设备编号为 block(3/64)。
由此我们可以看到,内核默认可以支持1~63个分区,其中第一个逻辑分区的编号肯定为/dev/hda5。但是,在/dev目录下查找有hda1~hda32,共32个分区文件,如果需要更多的分区,就需要使用mknod命令来创建更多的设备文件。
/dev/hdc是第二个IDE接口的主设备;/dev/hdd是第二个IDE接口的从设备。
2.安装、升级常见的IDE驱动程序
通用的IDE控制器可以通过内核这样加载起来,如果遇到一些较新的芯片组,当前的内核无法完全发挥出新硬件的性能,这时就要向内核中打补丁,例如,2.4.20-8的内核就无法支持VIA VT8237芯片组中的IDE ATA133方式,需要向内核中打补丁。
先到VIA的网站上下载相关补丁,网址为http://www.viaarena.com/?PageID=297#ATA,注意要选择适合当前自己内核的驱动,接下来是升级内核,给内核打补丁。
# rpm -ivh kernel-source-<Kernel Version>.i386.rpm
|
安装需要版本的源代码包。把刚才链接中的补丁下载,将这个patch文件解开:
# tar xzvf VIA IDE ATA133 Patch 8237 ver0.8.gz
|
进入解包出来的目录,将需要的patch文件cp到 /usr/src目录:
# cp <Linux OS>-patch-<Kernel Version> /usr/src
|
Kernel Version代表内核的版本号,Linux OS代表不同的Linux系统。
# cd /usr/src
# patch -p0 < <Linux OS>-patch-<Kernel Version>
|
将patch打入内核中,重新编译内核:
# cd /usr/src/linux-<Kernel Version>
|
编辑 Makefile文件,把 "EXTRAVERSION=" 改成 "EXTRAVERSION=-test",这是给新的内核命名。
# cp /boot/config-XXX .config
# make menuconfig ( config 或 xconfig也可以 )
|
确定 "ATA/IDE/MFM/RLL support/IDE,ATA and ATAPI Block devices"中的"VIA82CXXX chipset support"被选中。
开始编译内核:
# make dep
# make clean
# make bzImage
# make modules
# make modules_install
# cp arch/i386/boot/bzImage (或 vmlinuz-test) /boot/vmlinuz-test
# cp /boot/initrd-< Kernel Version >.img /boot/initrd-test.img
|
编辑 /boot/grub/grub.conf文件,在最后添加下面三行:
title linux-test
kernel /boot/vmlinuz-test ro root=/dev/hda1
initrd /boot/initrd-test.img
|
重新启动系统,使用刚刚编译的内核就会发现启动信息中多出一行“linux-test”。留意启动时的信息,就会发现有下面一行信息:
"VP_IDE: VIA vt8237 (rev 00) IDE UDMA133 Controller on pci00:0f.1"
|
如果正常启动,各种服务也都没有问题,那么以后就可以用这个新的内核了。可以用# hdparm -i命令来调整硬盘的传输方式,检查硬盘目前的传输模式。
/dev/hda:
Model=IC25N040ATCS05-0, FwRev=CS4OA63A, SerialNo=CLP429F4HALVPA
Config={ HardSect NotMFM HdSw>15uSec Fixed DTR>10Mbs }
RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=4
BuffType=DualPortCache, BuffSize=7898kB, MaxMultSect=16, MultSect=16
CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=78140160
IORDY=on/off, tPIO={min:240,w/IORDY:120}, tDMA={min:120,rec:120}
PIO modes: pio0 pio1 pio2 pio3 pio4
DMA modes: mdma0 mdma1 mdma2
UDMA modes: udma0 udma1 udma2 udma3 udma4 *udma5 //这里显示所支持的硬盘传输模式
AdvancedPM=yes: mode=0x80 (128) WriteCache=enabled
Drive conforms to: ATA/ATAPI-5 T13 1321D revision 3:
* signifies the current active mo
|
查看一下当前硬盘的工作模式,如果不是ATA133,则可以灵活使用控制硬盘传输模式的命令:
# hdparm -d1 /dev/hda //enable DMA 模式
# hdparm -d0 /dev/hda //disable DMA 模式
# hdparm -X70 /dev/hda //将传输模式切换到UDMA 6 -ATA133模式
|
-X后数字16~18代表SDMA 0~2,32~34代表MDMA 0~2,64~70代表UDMA 0~6。
将最后一行加入到/etc/rc.d/rc.sysinit或/etc/rc.d/rc.local文件中,可以让硬盘每次启动都工作在ATA133下。
3.安装nforce芯片组的驱动程序
AMD64平台的nforce系列芯片组性能强劲,虽然可以用常规的方法加以驱动,但有可能无法发挥新设备的特性,或者该芯片组的网卡、声卡无法使用。nVIDIA提供了更方便的RPM文件供使用,其中一些是源代码tar文件,需要进行编译;有些是RPM包,直接进行安装就可以了。
nforce芯片组在Linux下驱动的下载地址为http://www.nvidia.com/object/linux_nforce_1.0-0275.html,其中包含了内核的补丁、芯片组中对网卡及声卡的驱动程序。下载经过编译的RPM包可以直接安装:
# rpm -ivh NVIDIA_nforce.athlon.rpm
|
如果使用的不是SuSE或Red Hat Linux系统,也可以下载带有源代码的.src.rpm包经过编译后再安装:
# rpm -ivh NVIDIA_nforce.src.rpm
//将驱动程序的源程序文件安装到系统中
# cd /usr/src/redhat/SPECS
# rpmbuild -bb NVIDIA_nforce.specs
//编译源驱动程序,编译成可直接使用的rpm文件
# cd /usr/src/redhat/RPM/i386/
//根据具体包的不同,也可能是i686、noarch等
# rpm -ivh NVIDIA_nforce.i386.rpm
//程序自动安装包内的驱动程序,并利用RPM包中的脚本自动配置
|
光驱的驱动及刻录机的使用
1.光驱的驱动过程
编译内核时,在ATA/IDE/MFM/RLL选单中都会有IDE/ATAPI CDROM support的选项,通常所见到的内核都将这个部分编译在了内核中,所以不需设置光驱就可以使用。下面看一下系统启动时光驱是如何驱动的:
# dmesg |grep CD
hdc: HL-DT-STCD-RW/DVD-ROM GCC-4240N, ATAPI CD/DVD-ROM drive
Uniform CD-ROM driver Revision: 3.12
|
一般的通用CD/DVD-ROM驱动程序就可以将光驱驱动起来,不需要特别的配置。如果遇到的是SCSI光驱,则一般的内核也可以驱动,因为在编译内核时,一般会将SCSI的内容编译出来。
如果没有SCSI的光驱驱动,则可以自己手动编译。make menuconfig(或xconfig)时,在SCSI support 选单中只要将SCSI support设置为“Y”或“M”(Y代表该部分编译在内核中,M表示该部分编译为内核模块);SCSI CD-ROM support设置为“Y”或“M”;SCSI generic support设置为“Y”或“M”,这样就可以驱动SCSI接口的光驱了。
2.CD/DVD刻录机的驱动及使用
现在CD或DVD刻录机越来越普及,那么在Linux下如何使用内置的CD或DVD刻录机呢?默认的情况下,系统会将刻录机视作只读的驱动器,只加载普通的CD/DVD-ROM驱动,光驱无法写入。
因此,需要用ide-scsi 伪设备驱动程序来驱动刻录机,将普通的IDE接口的设备模拟成一个SCSI接口的设备,这时才能向其中刻录。我们可以使用三种方式来实现将IDE光驱模拟为SCSI光驱。假设使用GRUB作为bootloader,刻录机安装在第二个IDE接口,是主设备,则它默认应该为/dev/hdc 。
(1)更改/boot/grub/grub.conf文件在kernel /boot/vmlinuz-2.XXX ro root=/dev/hda1之后,添hdc=ide-scsi。
(2)更改 /etc/modules.conf文件添加下面两行:
ide-cd ignore=\"hdc\"
ide-scsi
|
(3)直接编译内核
不编译ATA/IDE/MFM/RLL选单中的IDE/ATAPI CDROM support部分,但是要编译对SCSI光驱的支持。
上面三种方法都是不希望系统用自带的普通CD/DVD-ROM驱动程序去驱动刻录机,希望将刻录机模拟成一个SCSI设备,其中第一种方法最简单,成功后就可以通过以下命令来刻录CD或DVD光盘。
# mkisofs -Jv -V examplecd -o example.iso /root/
|
将/root/目录下的文件做成一个名叫example.iso的光盘镜像文件,该文件的卷标为xamplecd。
还可通过命令将该文件加载到/mnt/iso文件夹中,可以自由添加删除镜像中的文件,但要注意不要超过光盘的容量。
# mkdir /mnt/iso
# mount -t iso9660 -o loop example.iso /mnt/iso
|
调整/mnt/iso文件的内容:
最后使用cdrecord命令来刻录:
查看SCSI总线中刻录机的配置信息:
Cdrecord 2.0 (i686-pc-linux-gnu) Copyright (C) 1995-2002 J?rg Schilling
Linux sg driver version: 3.1.25
Using libscg version 'schily-0.7'
cdrecord: Warning: using inofficial libscg transport code version
(schily - Red Hat-scsi-linux-sg.c-1.75-RH '@(#)scsi-linux-sg.c
1.75 02/10/21 Copyright 1997 J. Schilling').
scsibus0:
0,0,0 0) 'HL-DT-ST' 'RW/DVD GCC-4240N' 'E112' Removable CD-ROM
0,1,0 1) *
0,2,0 2) *
0,3,0 3) *
0,4,0 4) *
0,5,0 5) *
0,6,0 6) *
0,7,0 7) *
|
可以看到目前的光驱在SCSI总线的参数,然后根据参数来输入下面的命令刻录光盘:
# cdrecord -v -eject speed=24 dev=0,0,0 example.iso
|
speed=24是以24倍速来刻录光盘,dev=后加上刚才显示的刻录机的SCSI参数。
|
|