2 FreeBSD 核心( 六 )


当调用登记程序段的时候,如果major号和/dev/MAKEDEV的major号有冲突的时候,
就调用全部无关性device file的处理routine,也可能没有预期的的灾难事情 。还有别的
以外事情,就是当/dev里没有对应的特殊设备文件的时候,也就不能从进程进行参考 。



FreeBSD核心探讨.9.驱动程序篇


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

推荐阅读