发信人: liangvy() 
整理人: hahalee(1999-05-19 10:14:46), 站内信件
 | 
 
 
[桃花岛主lenn<[email protected]] [版权所有,不得书面出版]
  2。3。1驱动程序初始化         从文件系统的模块可以看出来,如果要对驱动程序的物理设备进行io,必须 先对它们进行初始化,否则不能处理process的io。核心初始化的过程里,一共登记 了两个基本的操作过程。         1.probe         确认io设备         2.attach        设置device driver内部的数据结构,使它能够对io设备                         进行操作。登记中断子程序。         在device driver中的处理过程有:         1.i/o地址           i/o命令使用的地址,使io设备的控制硬件和数据交换。         2.中断号           io设备的状态变化的时候,向cpu发出通知。         3.共有内存地址           根据设备的不同,使用一部分内存空间进行cpu和数据的交换。         4.DMA通道           不用通过cpu做中介,设备和内存直接交换数据时候采用的通道的识别号。           cpu可以在数据传送的时候同时执行它的机器语言。         前两种是必须有的。设备根据他连接的总线设备不一样,处理过程也就不同。 这个在核心的configure中反映出来。
      各种总线设备的device driver的初始化         驱动程序的初始化在main()初始化的过程中调用configure()         (@i386/i386autoconf.c).
  EISA    bus         连接EISA bus的io设备用的device driver的初始化在eisa_configure() (@i386/eisa/eisaconf.c)。各个device driver在module里对struct eisa_driver  XXX(@i386/eisa/eisaconf.h)进行probe,attach等的设置,准备在宏DATA_SET (eisadriver_set,XXX)进行登记。         eisa_configure()(@i386/eisa/eisaconf.c)对连接EISA bus的全部io设备 标志和i/o地址进行检测。之后便调用登记的probe子程序。在probe子程序中,通过 eisa_match_dev()(@i386/eisa/eisaconf.c)对自身检测,查找io设备,检测i/o中断 号,然后进行使用预定,之后用eisa_registerdev()(@i386/eisa/eisaconf.c)在 struct eisa_driver XXX对这个设备操作,作为device driver登记。全部的io设备 的控制device driver登记完毕后,eisa_configure()就调用device driver的attach 子程序。attach子程序则进行中断处理程序的登记和device driver的数据的初始化。
          核心的configure文件登记了以下的一些device driver: -------------------------------------------------------------------------- device  device driver的情报     source                  参考 --------------------------------------------------------------------------         mainboard_drv           i386/eisa/eisaconf.c     ahb     ahb_eisa_driver         i386/eisa/aha1742.c     scsi adapt ahc     ahc_eisa_driver         i386/eisa/aic7770.c     scsi adapt bt      bt_eisa_driver          i386/eisa/bt74x.c       scsi adapt ep      ep_eisa_driver          i386/eisa/3c5x9.c       network interface fea     pdq_eisa_driver         i386/eisa/if_fea.c      network interface vx      vx_eisa_driver          i386/eida/if_vx_eisa.c  network interface --------------------------------------------------------------------------
  PCI     bus         连接pci bus的设备的初始化在pci_configure()(@pci/pci.c)进行。各个 device driver在module内的struct pci_device XXX(@pci/pcivar.h)设置probe和 attach,在通过宏DATA_SET(pcidevice_est,XXX)进行登记。         DATA_SET(pcibus_set,i386pci)(@i386/isa/pcibus.c)登记的子程序可以 得到有关pci bus的一些信息。之后和eisa bus处理过程一样进行各种各样的调用。         核心的configure文件登记了以下的一些device driver: -------------------------------------------------------------------------- device  device driver的情报     source                  参考 -------------------------------------------------------------------------- ahc     ahc_pci_driver          pci/aic7870.c           scsi adapt bt      bt_pci_driver           pci/bt9xx.c             scsi adapt ncr     ncr_device              pci/ncr.c               scsi adapt amd     trmamd_device           pci/tek390.c            scsi adapt cy      cy_device               pci/cy_pci.c            serial port meteor  met_device              pci/meteor.c            meteor通道 stl     stlpcidriver            i386/isa/stallion.c     serial port wdc     wdc_pci_driver          pci/wdc_p.c             ide control de      dedevice                pci/if_de.c             network interface ed      ed_pci_driver           pci/if_ed_p.c           network interface fpa     pfadevice               pci/if_pfa.c            network interface fxp     fxp_device              pci/if_pxp.c            network interface lnc     lnc_pci_driver          pci/if_lnc_p.c          network interface sr      sr_pci_driver           pci/if_sr_p.c           network interface vx      vxdevice                pci/if_vx_pci.c         network interface -------------------------------------------------------------------------
  ISA     bus         连接ISA bus的io设备的device driver的初始化在isa_configure()(@i386/ isa/isa.c)进行。和EISA,PCI很大的一个区别就是,在核心的配置文件中,要指定所 有的io地址等。         configure文件中,有象如下的记录                 controller      控制设备名      at isa?...                 device          device名        at isa?...         这些内容在编译核心的目录下作为ioconf.c的struct isa_device  isa_devtab_XXX[]的初始值由config命令写进去。在struct isa_device(@i386/isa /isa_device.h)的上,其次的成员变量由configure文件的记录内容进行设定。但是 ,“名字”是控制设备名/device名的数字除外的部分。 ------------------------------------------------------------------------- member名                configure的记述内容 ------------------------------------------------------------------------- id_driver               名字drvier id_iobase               prot I/O address id_irq                  irq号 id_drq                  drq DMA通道号 id_maddr                iomem共有memory address id_msize                iosiz共有memory长度 id_intr                 vector device driver的中断处理程序名 id_unit                 名字的后的数字(?) id_flags                flags -------------------------------------------------------------------------
          但是,和控制设备/device名有关的一些东西如bio,net,tty出现的场合,这 些一般成为isa_devtab_bio[],isa_devtab_net[],isa_devtab_tty[]数组的初始值。 没有的情况,则成为isa_tab_null[]的初始值。还有一个就是名字driver,它是各个 device driver的module内部的struct isa_driver(@i386/isa/isa_device.h)一个东 西。对isa bus设备的device driver,这个是一个固定值。 象这样的记录: ------------------------------------------------------------ disk    device名        at      控制设备名      driver  数字 tape    device名        at      控制设备名      driver  数字 ------------------------------------------------------------ 每个数字除外控制设备名(wdc或者fdc),总结起来就是写进一个叫做 isa_biotab_控制设备名[]的数组的某个元素的初始设定值。但对unit成员填入数字 外,其他的也就和isa_devtab_bio[]的内容一样。         isa_configure()依照isa_devtab_bio[],isa_devtab_net[], isa_devtab_tty[]的设定值调用probe子程序对设备的有无进行确认。有的话就继续 调用attach子程序。         probe子程序对设备进行确认,不同的probe子程序也有可能对同样的io地址 进行操作。所以为了防止这个问题,isa_configure()对已经确认过的的io地址不再 给别的probe进行动作。         同样,错认的可能性也有的。必要的时候没连接的设备的probe要禁止使用, (在boot的参数的时候)。
  --
  Lenn  Tel:    0755-3913403(H) E-mail: [email protected] Oicq: Lenn 28663
  ※ 来源:.网易 BBS bbs.netease.com.[FROM: www2.dt.sanyo.co.jp]
  | 
 
 
 |