squirrel
驱动牛犊
驱动牛犊
  • 注册日期2002-03-16
  • 最后登录2002-08-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:4713回复:12

操作系统是如何知道pci的配置空间的地址的

楼主#
更多 发布于:2002-04-07 13:34
底层的操作是通过在pci的四根(32为)命令引脚上上发送命令信号来获取配置空间的内容的,但从宏观上来看,操作系统是如何知道该pci插槽上的配置空间的地址的呢?我的理解是,这个具体的译码过程是设计pci板时,通过译码电路来实现的。也就是说,当pci卡上的接口芯片受到总线上(四根控制线)的命令信号后,去通过自己已经固化的机制来完成的,如读取相应数据给pci总线,以供cpu读取,或者将总线上的数据写入相应的寄存器。
这种理解有问题吗?如果没有,还有具体的补充吗?
jerf.cat
驱动中牛
驱动中牛
  • 注册日期2002-03-30
  • 最后登录2005-09-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-04-07 15:38
It is not right.Please see
pci system Architecture Fourth Edition
squirrel
驱动牛犊
驱动牛犊
  • 注册日期2002-03-16
  • 最后登录2002-08-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-04-07 15:40
why not just say something about it.
And i haven\'t got the book.
Tom.Cat
禁止发言
禁止发言
  • 注册日期2001-10-10
  • 最后登录2019-07-29
  • 粉丝1
  • 关注0
  • 积分-53792分
  • 威望197411点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2002-04-07 16:25
用户被禁言,该主题自动屏蔽!
jerf.cat
驱动中牛
驱动中牛
  • 注册日期2002-03-30
  • 最后登录2005-09-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-04-07 16:42
Suggest you find a book.Electronic Industry Publish.
xmzhu
驱动牛犊
驱动牛犊
  • 注册日期2002-03-08
  • 最后登录2002-04-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-04-08 09:30
对80X86系列,PCI总线配置周期的读写是通过0cf8h和0cfch这两个端口实现的, 其中0cf8h送的是地址,包括哪一PCI总线和PCI设备配置空间的哪个寄存器等等. 我想应该是由主板设计者,实现利用从0cf8h送出的地址信号,去译码,从而选中主板上的哪一个PCI总线槽.关于如何实现这个译码,可以有不同的方式.可以看\"PCI系统结构\"一书.
squirrel
驱动牛犊
驱动牛犊
  • 注册日期2002-03-16
  • 最后登录2002-08-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-04-08 10:04
这个我明白,但送出读写口命令之后总要利用C/BE[3:0]#,因为它不是有个配置读写的指令吗101x,否则设置它有什么意义?
另外我主要不是不明白如何确定槽的位置,而是确定槽上卡的配置空间的位置?
xmzhu
驱动牛犊
驱动牛犊
  • 注册日期2002-03-08
  • 最后登录2002-04-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-04-08 12:34
1.卡上的接口芯片利用C/BE[3:0]进行内部译码决定是对内存,还是i/o,还是配置空间进行操作.
2.卡上配置空间的位置(即在配置空间中的相对位置)是由CPU写入端口0cf8h的32位内容中的D7~D2位决定.
squirrel
驱动牛犊
驱动牛犊
  • 注册日期2002-03-16
  • 最后登录2002-08-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-04-08 14:28
由D7~D2“决定”,应该是操作是确定具体对那个字进行操作才对吧,因为其相对位置应该是在板确定之后,或者在操作系统加载驱动之后就已经确定的。
hglzw
驱动小牛
驱动小牛
  • 注册日期2001-06-12
  • 最后登录2006-03-03
  • 粉丝0
  • 关注0
  • 积分19分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-04-09 16:37
squirrel老兄,你不会是想自己做一个pci桥吧?
  不错,pci是通过对C/BE[3:0]#译码,来实现对本地的配置读写等操作。但现在我们不必担心这些了,pci桥生产厂家为我们完成了这些十分繁琐的译码也提供了所需的寄存器。
  例如,plx9050/9080等,你只需提供将哪一个空间(0-5)映射为内存或io以及io或内存的范围即可。
  对于支持即插即用的操作系统如98/2000,一旦发现新的pci卡,将会自动读取pci桥片中的寄存器,并根据寄存器中提供的信息自动分配io空间,内存映射空间或中断号。并将这些信息记录,这些信息中将包括总线号和槽号。
   系统中的每个卡或设备都有自己的信息记录块。pci卡也是如此,因为每个pci桥片都有自己的售主号(vendor id)和设备号(device id)以及硬件版本号等等,这些正是系统能区别每个板卡的关键所在。
  在驱动程序中,你也必须根据你所选用的pci桥的vendor id,device id以及卡上配置空间的位置(就是前面提供的,对你自己来说是透明的)来获得卡的其他资源描述。
  具体方法98,2000有所不同。但cf8,cfc地址在98/2000下都适用。
  但我喜欢第三方开发的驱动开发工具如driverstudio,他使我们方便的取得io和内存映射基地址。
  
  
[img]http://www.kinboh.com/images/5130.jpg[/img]
squirrel
驱动牛犊
驱动牛犊
  • 注册日期2002-03-16
  • 最后登录2002-08-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-04-09 19:01
hglzw大哥,我当然不想自己做个桥,但我想明白其中的道理。虽然你说那其中很复杂,也没有说明其中的情况(那估计是人家厂商的商业秘密了),但至少你说的,让我肯定自己的理解是正确的。谢谢你。给你加分了,虽然少得可怜(但我自己也不多呀^_^)
xmzhu
驱动牛犊
驱动牛犊
  • 注册日期2002-03-08
  • 最后登录2002-04-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-04-13 11:20
PCI总线有256字节(即64双字)的配置空间, PCI总线协议对配置空间中各个寄存器的含义有明确的规定, 如果想读/写哪个寄存器内容,只要给出其在配置空间中的相对位置即可,. 还换言之, 在CPU往0CF8H端口写的内容里,给出了要操作的是主板上哪个PCI槽,以及槽上PCI设备配置空间中的哪各寄存器内容,即在D7~D2中给出哪个寄存器. 不知是否解释了你\"不明白符合确定槽上卡的配置空间的位置\"的问题?
lw2002
驱动牛犊
驱动牛犊
  • 注册日期2002-04-13
  • 最后登录2002-04-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-04-13 14:02
最终是靠硬件译码配置空间的地址值(设备号部分),选通PCI插槽的IDSEL信号,而选择了不同的插槽。
游客

返回顶部