《linux操作系统的驱动框架及驱动加载》由会员分享,可在线阅读,更多相关《linux操作系统的驱动框架及驱动加载(13页珍藏版)》请在金锄头文库上搜索。
1、Linux 驱动框架及驱动加载本讲主要概述 Linux 设备驱动框架、驱动程序的配置文件及常用的加载驱动程序的方法;并且介绍 Red Hat Linux 安装程序是如何加载驱动的,通过了解这个过程, 我们可以自己将驱动程序放到引导盘中;安装完系统后,使用 kudzu 自动配置硬件程序。 Linux 设备驱动概述 1. 内核和驱动模块 操作系统是通过各种驱动程序来驾驭硬件设备,它为用户屏蔽了各种各样的设备,驱动硬件是操作系统最基本的功能,并且提供统一的操作方式。正如我们查看屏幕上的文档时,不用去管到底使用nVIDIA 芯片,还是 ATI 芯片的显示卡,只需知道输入命令后,需要的文字就显示在屏幕上
2、。硬件驱动程序是操作系统最基本的组成部分,在 Linux 内核源程序中也占有较高的比例。 Linux 内核中采用可加载的模块化设计( LKMs ,Loadable Kernel Modules),一般情况下编译的 Linux 内核是支持可插入式模块的,也就是将最基本的核心代码编译在内核中,其它的代码可以选择是在内核中,或者编译为内核的模块文件。 如果需要某种功能,比如需要访问一个 NTFS 分区,就加载相应的 NTFS 模块。这种设计可以使内核文件不至于太大,但是又可以支持很多的功能,必要时动态地加载。这是一种跟微内核设计不太一样,但却是切实可行的内核设计方案。 我们常见的驱动程序就是作为内核
3、模块动态加载的,比如声卡驱动和网卡驱动等,而 Linux 最基础的驱动,如 CPU、PCI 总线、TCP/IP 协议、APM(高级电源管理)、 VFS 等驱动程序则编译在内核文件中。有时也把内核模块就叫做驱动程序,只不过驱动的内容不一定是硬件罢了,比如 ext3 文件系统的驱动。 理解这一点很重要。因此,加载驱动时就是加载内核模块。下面来看一下有关模块的命令,在加载驱动程序要用到它们:lsmod、modprob、insmod、rmmod、modinfo。 lsmod 列出当前系统中加载的模块,例如: #lsmod (与 cat /proc/modules 得出的内容是一致的)Module Si
4、ze Used by Not taintedradeon 115364 1 agpgart 56664 3 nls_iso8859-1 3516 1 (autoclean)loop 12120 3 (autoclean)smbfs 44528 2 (autoclean)parport_pc 19076 1 (autoclean)lp 9028 0 (autoclean)parport 37088 1 (autoclean) parport_pc lpautofs 13364 0 (autoclean) (unused)ds 8704 2 yenta_socket 13760 2 pcmcia_
5、core 57184 0 ds yenta_sockettg3 55112 1 sg 36940 0 (autoclean)sr_mod 18104 0 (autoclean)microcode 4724 0 (autoclean)ide-scsi 12208 0 scsi_mod 108968 3 sg sr_mod ide-scsiide-cd 35680 0 cdrom 33696 0 sr_mod ide-cdnls_cp936 124988 1 (autoclean)nls_cp437 5148 1 (autoclean)vfat 13004 1 (autoclean)fat 388
6、72 0 (autoclean) vfatkeybdev 2976 0 (unused)mousedev 5524 1 hid 22212 0 (unused)input 5888 0 keybdev mousedev hidehci-hcd 20104 0 (unused)usb-uhci 26412 0 (unused)usbcore 79392 1 hid ehci-hcd usb-uhciext3 91592 2 jbd 52336 2 ext3上面显示了当前系统中加载的模块,左边数第一列是模块名,第二列是该模块大小,第三列则是该模块使用的数量。 如果后面为 unused,则表示该模块
7、当前没在使用。如果后面有autoclean,则该模块可以被 rmmod -a 命令自动清洗。rmmod -a 命令会将目前有 autoclean 的模块卸载,如果这时候某个模块未被使用,则将该模块标记为 autoclean。如果在行尾的 括号内有模块名称,则括号内的模块就依赖于该模块。例如: cdrom 34144 0 sr_mod ide-cd其中 ide-cd 及 sr_mod 模块就依赖于 cdrom 模块。 系统的模块文件保存在/lib/modules/2.4.XXX/kerne 目录中,根据分类分别在 fs、net 等子目录中,他们的互相依存关系则保存在/lib/modules/2.
8、4.XXX/modules.dep 文件中。 需要注意,该文件不仅写入了模块的依存关系,同时内核查找模块也是在这个文件中,使用 modprobe 命令,可以智能插入模块,它可以根据模块间依存关系,以及/etc/modules.conf 文件中的内容智能插入模块。比如希望加载 ide 的光驱驱动,则可运行下面命令: # modprobe ide-cd此时会发现,cdrom 模块也会自动插入。 insmod 也是插入模块的命令,但是它不会自动解决依存关系,所以一般加载内核模块时使用的命令为 modprobe。 rmmod 可以删除模块,但是它只可以删除没有使用的模块。 Modinfo 用来查看模块
9、信息,如 modinfo -d cdrom,在 Red Hat Linux 系统中,模块的相关命令在 modutils 的 RPM 包中。2设备文件 当我们加载了设备驱动模块后,应该怎样访问这些设备呢?Linux 是一种类 Unix 系统, Unix 的一个基本特点是 “一切皆为文件”,它抽象了设备的处理,将所有的硬件设备都像普通文件一样看待,也就是说硬件可以跟普通文件一样来打开、关闭和读写。 系统中的设备都用一个设备特殊文件代表,叫做设备文件,设备文件又分为 Block(块)型设备文件、 Character(字符)型设备文件和 Socket(网络插件)型设备文件。Block 设备文件常常指定
10、哪些需要以块(如 512 字节)的方式写入的设备,比如 IDE 硬盘、SCSI硬盘、光驱等。 而 Character 型设备文件常指定直接读写,没有缓冲区的设备,比如并口、虚拟控制台等。Socket(网络插件)型设备文件指定的是网络设备访问的 BSD socket 接口。 ls -l /dev/hda /dev/video0 /dev/logbrw-rw- 1 root disk 3, 0 Sep 15 2003 /dev/hdasrw-rw-rw- 1 root root 0 Jun 3 16:55 /dev/logcrw- 1 root root 81, 0 Sep 15 2003 /de
11、v/video0上面显示的是三种设备文件,注意它们最前面的字符,Block 型设备为 b,Character 型设备为 c,Socket 设备为 s。 由此可以看出,设备文件都放在/dev 目录下,比如硬盘就是用/dev/hd*来表示,/dev/hda 表示第一个 IDE 接口的主设备,/dev/hda1表示第一个硬盘上的第一个分区;而/dev/hdc 表示第二个 IDE 接口的主设备。可以使用下面命令: dd if=/dev/hda of=/root/a.img bs446 count1把第一个硬盘上前 446 个字节的 MBR 信息导入到 a.img 文件中。对于 Block 和 Char
12、acter 型设备,使用主(Major)和辅(minor)设备编号来描述设备。主设备编号来表示某种驱动程序,同一个设备驱动程序模块所控制的所有设备都有一个共同的主设备编号,而辅设备编号用于区分该控制器下不同的设备,比如,/dev/hda1(block 3/1)、 /dev/hda2(block 3/2 )和/dev/hda3( block3/3 )都代表着同一块硬盘的三个分区,他们的主设备号都是 3,辅设备号分别为 1、2、3。 这些设备特殊文件用 mknod 命令来创建: # mknod harddisk b 3 0我们就在当前位置创建出一个与 /dev/hda 一样的、可以访问第一个 ID
13、E 设备主硬盘的文件,文件名叫做 harddisk。 使用下面命令可以查看设备编号: #file /dev/hda/dev/hda: block special (3/0)其中 Block 代表/dev/hda 是系统的 Block 型(块型)设备文件,它的主设备编号为 3,辅设备编号为 0。 #ls -l /dev/hda /dev/hdb brw-rw- 1 root disk 3, 0 Sep 15 2003 /dev/hdabrw-rw- 1 root disk 3, 64 Sep 15 2003 /dev/hdb使用 ls l 也可以看到设备编号,/dev/hdb 代表第一个 IDE
14、 接口的从设备(Slave )也是 Block 设备,编号为 (3/64),还有另外一种设备文件是/dev/tty*。使用如下命令: #echo hello tty1 /dev/tty1将字符串“hello tty1”输出到/dev/tty1 代表的第一个虚拟控制台上,此时按“Alt + F1”可以看到该字符出现在屏幕上,这个特殊的文件就代表着我们的第一虚拟控制台。 file /dev/tty1/dev/tty1: character special (4/1)由上可以看到,它的类型为 Character 型(字符型)设备文件,主设备号为 4,辅设备号为 1。同样,/dev/tty2 代表着第
15、二个虚拟控制台,是 Character 设备,编号为 (4/2)。 当将/dev/cdrom 加载到/mnt/cdrom 中时,只要访问/mnt/cdrom 系统就会自动引入到/dev/cdrom 对应的驱动程序中,访问实际的数据。有关设备文件的编号可以看内核文档/usr/src/linux-2.*/Documentation/devices.txt 文件(在 Kernel 的源文件解包后的Documentation 目录中 ),其中详细叙述了各种设备文件编号的意义。3.使用/proc 目录中的文件监视驱动程序的状态 通过设备文件怎样访问到相应的驱动程序呢?它们中间有一个桥梁,那就是 proc
16、 文件系统,它一般会被加载到/proc 目录。访问设备文件时,操作系统通常会通过查找/proc 目录下的值,确定由哪些驱动模块来完成任务。如果 proc 文件系统没有加载,访问设备文件时就会出现错误。 Linux 系统中 proc 文件系统是内核虚拟的文件系统,其中所有的文件都是内核中虚拟出来的,各种文件实际上是当前内核在内存中的参数。它就像是专门为访问内核而打开的一扇门,比如访问/proc/cpuinfo 文件,实际上就是访问目前的 CPU 的参数,每一次系统启动时系统都会通过/etc/fstab 中设置的信息自动将 proc 文件系统加载到/proc 目录下: # grep proc /etc/fstabnone /proc proc defaults 0 0此外,也可以通过 mount 命令手动加载: # mount -t proc none /proc通过/proc 目录下的文件可以访问或更改内核参数