首页 | Linux 基础 | 资讯动态 | Linux 应用 | Linux 服务器 | Linux 开发 | Linux 安全 | 专题 | 联盟论坛
  当前位置:主页>Linux 开发>linux 内核>文章内容
概述Linux系统的驱动框架及驱动加载
来源:http://www.unix5.com/ 作者:hl155 发布时间:2007-08-20  
    本讲主要概述Linux设备驱动框架、驱动程序的配置文件及常用的加载驱动程序的方法;并且介绍Red Hat Linux安装程序是如何加载驱动的,通过了解这个过程, 我们可以自己将驱动程序放到引导盘中;安装完系统后,使用kudzu自动配置硬件程序。
      Linux设备驱动概述 1. 内核和驱动模块
              操作系统是通过各种驱动程序来驾驭硬件设备,它为用户屏蔽了各种各样的设备,驱动硬件是操作系统最基本的功能,并且提供统一的操作方式。正如我们查看屏幕上的文档时,不用去管到底使用nVIDIA芯片,还是ATI芯片的显示卡,只需知道输入命令后,需要的文字就显示在屏幕上。硬件驱动程序是操作系统最基本的组成部分,在Linux内核源程序中也占有较高的比例。 Linux内核中采用可加载的模块化设计(LKMs ,Loadable Kernel Modules),一般情况下编译的Linux内核是支持可插入式模块的,也就是将最基本的核心代码编译在内核中,其它的代码可以选择是在内核中,或者编译为内核的模块文件。 如果需要某种功能,比如需要访问一个NTFS分区,就加载相应的NTFS模块。这种设计可以使内核文件不至于太大,但是又可以支持很多的功能,必要时动态地加载。这是一种跟微内核设计不太一样,但却是切实可行的内核设计方案。
              我们常见的驱动程序就是作为内核模块动态加载的,比如声卡驱动和网卡驱动等,而Linux最基础的驱动,如CPU、PCI总线、TCP/IP协议、APM(高级电源管理)、VFS等驱动程序则编译在内核文件中。有时也把内核模块就叫做驱动程序,只不过驱动的内容不一定是硬件罢了,比如ext3文件系统的驱动。 理解这一点很重要。因此,加载驱动时就是加载内核模块。下面来看一下有关模块的命令,在加载驱动程序要用到它们:lsmod、modprob、insmod、rmmod、modinfo。 lsmod 列出当前系统中加载的模块,例如:
#lsmod (与cat /proc/modules 得出的内容是一致的)Module Size 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 lp]autofs 13364 0 (autoclean) (unused)ds 8704 2 yenta_socket 13760 2 pcmcia_core 57184 0 [ds yenta_socket]tg3 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-scsi]ide-cd 35680 0 cdrom 33696 0 [sr_mod ide-cd]nls_cp936 124988 1 (autoclean)nls_cp437 5148 1 (autoclean)vfat 13004 1 (autoclean)fat 38872 0 (autoclean) [vfat]keybdev 2976 0 (unused)mousedev 5524 1 hid 22212 0 (unused)input 5888 0 [keybdev mousedev hid]ehci-hcd 20104 0 (unused)usb-uhci 26412 0 (unused)usbcore 79392 1 [hid ehci-hcd usb-uhci]ext3 91592 2 jbd 52336 2 [ext3]

         上面显示了当前系统中加载的模块,左边数第一列是模块名,第二列是该模块大小,第三列则是该模块使用的数量。 如果后面为unused,则表示该模块当前没在使用。如果后面有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.4.XXX/modules.dep 文件中。 需要注意,该文件不仅写入了模块的依存关系,同时内核查找模块也是在这个文件中,使用modprobe命令,可以智能插入模块,它可以根据模块间依存关系,以及/etc/modules.conf文件中的内容智能插入模块。比如希望加载ide的光驱驱动,则可运行下面命令:
# modprobe ide-cd
          此时会发现,cdrom模块也会自动插入。 insmod也是插入模块的命令,但是它不会自动解决依存关系,所以一般加载内核模块时使用的命令为modprobe。 rmmod可以删除模块,但是它只可以删除没有使用的模块。 Modinfo用来查看模块信息,如modinfo -d cdrom,在Red Hat Linux系统中,模块的相关命令在modutils的RPM包中。
   2.设备文件
         当我们加载了设备驱动模块后,应该怎样访问这些设备呢?Linux是一种类Unix系统,Unix的一个基本特点是“一切皆为文件”,它抽象了设备的处理,将所有的硬件设备都像普通文件一样看待,也就是说硬件可以跟普通文件一样来打开、关闭和读写。 系统中的设备都用一个设备特殊文件代表,叫做设备文件,设备文件又分为Block(块)型设备文件、Character(字符)型设备文件和Socket(网络插件)型设备文件。Block设备文件常常指定哪些需要以块(如512字节)的方式写入的设备,比如IDE硬盘、SCSI硬盘、光驱等。 而Character型设备文件常指定直接读写,没有缓冲区的设备,比如并口、虚拟控制台等。Socket(网络插件)型设备文件指定的是网络设备访问的BSD socket 接口。
共4页: 上一页 1 [2] [3] [4] 下一页
 
如果您对本文有任何疑问或者建议,请到论坛讨论区发表您的意见: >> 论坛入口
[收藏] [推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]  
  热点文章
·使用 Linux 系统调用的内核命令
·Linux 2.6.11内核文件IO系统调用
·Linux操作系统的源代码目录树结
·Linux用户态与内核态的交互讲解
·Linux内核对I/O端口的管理实现(
·深入分析 Linux操作系统的内核链
·Linux内核可装载模块对设备驱动
·详解Linux 2.6内核新文件系统变
·Linux系统可卸载内核模块完全指
·FreeBSD手册讲解(一)--配置FreeB
·编译Linux操作系统的内核讲解
·Linux系统可卸载内核模块完全指
  相关文章
·调整内核网络参数提高Linux系统
·Linux可加载内核模块:入侵响应
·Linux 2.6新内核的设计理念及新
·Linux内核重编译常见故障及其解
·Linux用户态与内核态的交互讲解
·FreeBSD手册讲解(二)—配置FreeB
·FreeBSD手册讲解(一)--配置FreeB
·一种内核到用户空间的高效数据传
·Linux系统内核新型包过滤结构的
·编译支持NTFS的Linux系统内核模
·Linux操作系统动态函式库讲解(二
·Linux操作系统动态函式库讲解(

本站信息源至:互联网络,均为学习,交流所用,如有版权问题,请联系我们.
站长QQ:397422079 E_mail:riechelr_hl@unix5.com
转载本站内容请注明原作者名.谢谢!