|
FreeBSD 核心 (2)
|
|
就不同。
这个在核心的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的参数的时候)。
上一页 [1] [2] [3] [4]
|
| 上一篇:FreeBSD 核心 (1) 下一篇:FreeBSD内核定制参考 |