现在的位置: 首页 >> 操作系统 >> FreeBSD >> FreeBSD 核心 (2)
添加时间:2005-8-21 来源:网教中国 作者:
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内核定制参考
大部分文章摘自网上,如有侵犯您的权益请与我们联系,我们会第一时间进行处理,谢谢! [ 打印文章 ] [ 关闭窗口 ]
推荐文章
·FreeBSD handbook中文版 9 配制F
·FreeBSD 升级系统
·Ports & Package
·FreeBSD kernel 编译大法(二)ker
·FreeBSD 上使用Kerberos 5认证
·FreeBSD 5.x 中 gbfs 的修正,及
·FreeBSD 安装Linuxigd
·FreeBSD 使用cvsd创建安全的cvs
·FreeBSD trafcount命令介绍
·FreeBSD入门安装及汉化
相关文章
·FreeBSD 核心 (1)
·FreeBSD4.8 IPFW How to!
·FreeBSD下的内存文件系统
·FreeBSD内核定制参考
·freebsd系统日志与备份
·关于FreeBSD4.4网络源代码接口层
·FreeBSD 5.2.1 boot0(启动扇区代
·FreeBSD中的设备命名规则
·FreeBSD 5内核源代码分析之copyi
·FreeBSD 5内核源代码分析之系统
最新文章
·FreeBSD连载(94):基于NAT的负载
·FreeBSD连载(93):反向代理负载
·FreeBSD连载(92):基于DNS的负载
·FreeBSD连载(91):提升静态网页
·FreeBSD连载(90):单服务器性能
·FreeBSD连载(89):CGI和SSI的安
·FreeBSD连载(88):安全连接方式S
·FreeBSD连载(87):基于用户的访
·FreeBSD连载(86):对IP地址和域
·FreeBSD连载(85):配置Apache服(
Google