极限首页 业界焦点 软件工程师之路 系统工程师之路 网络工程师之路 软件下载 技术社区
 Linux操作系统的内核编译内
 Linux下设备完全驱动之四
 Linux下设备完全驱动之三
 Linux下设备完全驱动之一
 Linux内核如何从2.4升级到
 开源世界的虚拟机 QEMU
 Linux下软件RAID的实现
 RHEL4内建LVM工具入门
 linux SSH 的一些安全小技
 Cron服务配置详解
 Linux操作系统的内核编译内
 Linux下设备完全驱动之四
 Linux下设备完全驱动之三
 Linux下设备完全驱动之一
 Linux内核如何从2.4升级到
 开源世界的虚拟机 QEMU
 Linux下软件RAID的实现
 RHEL4内建LVM工具入门
 linux SSH 的一些安全小技
 Cron服务配置详解

Shell 中文手册

Python 2.3 中文手册

Python 2.4 中文手册

Mysql 4.x 中文手册

PHP 4.x 中文手册

Apache 2.x 中文手册
更多手册

站内搜索:
当前位置:首页>>系统工程师之路>>管理进阶>>正文
Linux下设备完全驱动之二(1)
时间:2005-09-25 作者:郄晓烨 来源:赛迪

  前一节Linux培训园地:Linux下设备完全驱动之一,大家看过之后相信一定印象深刻。这一节首先讲述IDE硬盘及光驱的设置、IDE刻录机的使用,以及如何安装SCSI硬盘驱动。然后介绍以太网卡驱动模块的加载及网络接口的启功过程,如何调整网卡的参数,Modem、ADSL和宽带的驱动安装,以及PPP连接的设置等。

IDE硬盘及光驱

1.IDE设备的驱动过程

操作系统首先是安装在块设备上,没有对块设备的支持系统就无法启动,所以首先介绍常见块设备的安装。硬盘就是最常见的块设备,普通PC上的硬盘通常是IDE接口的,而服务器上的硬盘通常是SCSI接口的。

一般内核中内置对通用IDE控制芯片的支持。下面看一下IDE硬盘在内核中的驱动过程,dmesg命令可以看到内核在启功和加载内核模块时的信息:

# dmesg | less


在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文件的内容:

# umount /mnt/iso


最后使用cdrecord命令来刻录:

# cdrecord -scanbus


查看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参数。

  共2页: 1 [2] 下一页   
推荐】【 】【关闭


关于极限 | 站内地图 | 意见反馈 | 广告服务 | 数据服务 | 联系我们
本站所刊登的文章,技术资料,软件均整理于网络资源或本站原创,转载请务必联系原作者或本站。
Copyright ? 2001-2004 UPLinux.com All Rights Reserved.
本站唯一联系信箱:
京ICP备05010519