2 FreeBSD 核心( 七 )


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的参数的时候) 。

推荐阅读