PCI/PCIe 的那些事(1)- 总线基本知识

本文介绍了PCI总线的基本概念,包括其发展历程、结构特点以及如何解决ISA总线存在的问题。此外,还详细阐述了PCI总线的电气信号组成、总线操作机制及数据传输方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PCI 总线

PCI: 周边组件互联局部总线 (Peripheral Component Interconnect Local Bus)

1992年,Intel发布了PCI 1.0规范, 用于替代老的ISA总线。PCI总线的产生主要解决了ISA总线的以下几个缺点:

  • 总线容量不够
  • 地址宽度不够
  • 不支持即插即用

PCI采用的是树型拓扑结构,每一个PCI device相当于树的一个结点或者叶子,对整个PCI Bus的遍历可以采用遍历树的算法,在对树进行遍历之后,可以获得整个PCI Bus的资源需求情况,从而进行统一的分配。任何一下结点的损坏也不会造成整个树的崩溃,因而具有鲁棒性。

电气信号

  • 第一组:系统信号, 时钟信号(CLK)和复位信号(PCIRST#)
  • 第二组:地址/数据,命令/使能信号
  • 第三组:传输控制信号,FRAME#, TRDY#, IRDY#, STOP#, DEVSEL#, IDSEL
  • 第四组:仲裁请求和仲裁允许, REQ#, GNT#
  • 第五组:终端信号
  • 第六组:错误校验信号
  • 第七组:PCI64扩展信号

总线操作

PCI总线操作的一具典型的特点就是支持BURST传输。什么是BURST传输呢?首先你得知道PCI的数据总线和地址总线是复用的。这就是说在同样的总线上,一段时间是地址,一段时间是传输数据。如果没有BURST传输,那么完成一次数据传输之前都得发一次地址,这就是总线有一半的时间都在传地址,这使得总线和利用率很低。有了BURST传输,可以先发一个起始地址和数据长度N, 之后传输数据0~N-1就可以直接发数据,不用再发地址了。
PCI总线基本操作

PCI总线典型操作分为两部分:

  • 地址相, 当FRAME#有效时,C/BE#上面出现4位交易码,AD上面是地址数据
  • 数据相,当DEVSEL#有效时,AD上面出现传输数据
    交易码

PCI总线的具体交易过程如下:

  • 主设备发起#REQ, 申请总线的使用权
  • 得到仲裁允许,#GRT
  • FRAME#信号拉低,交易地址放入AD, 交易码放入C/BE#
  • 如果从设备就在这个总线上,那么地址译码成功后,从设备会把DEVSEL#拉低,就可以开妈传输数据了
  • 如果从设务不是直接连在总线上,而是跨过了PCI-PCI bridge。那么bridge就会启动一个请求重传的机制。即通过控制信号通知主设备重试,在此同时将自己作为主设备向下一级总线转发上级总线的交易请求,这样,当下一次主设备再次发起交易的时候,bridge上面已经有了从设备获取来的数据,交易就可以正常进行了。
### PCI中断资源分配与管理 PCI(Peripheral Component Interconnect)是一种用于连接计算机内部硬件设备的标准总线架构。在PCI系统中,中断资源的分配和管理是确保设备正常工作的重要环节。以下是关于PCI中断资源分配与管理的关键点: #### 1. 中断资源的基本概念 中断资源(Interrupt Request,IRQ)是PCI设备与主机通信的一种方式。每个PCI设备需要一个或多个中断号来通知主机其状态变化或请求服务[^1]。通常,中断资源的分配遵循以下原则: - **独享中断**:如果可能,尽量为每个设备分配独立的中断号,以避免中断共享带来的潜在冲突。 - **共享中断**:当可用中断数量有限时,可以允许多个设备共享同一个中断号。但需要注意的是,共享中断可能会增加中断处理的复杂性和延迟。 #### 2. 中断资源的分配策略 根据引用内容,中断资源的分配需要考虑设备的实际使用场景和硬件配置[^1]。例如: - 如果AGP显卡和PCI显卡不会同时使用,则可以将IRQ11分配给其中一个设备,使其处于独享状态。 - 对于电视卡等特殊设备,优先将其安装在独享中断资源的PCI插槽上(如PCI-2),以减少中断冲突的可能性。 - 声卡、网卡、内置Modem等设备也可以按照类似的原则进行安装和配置。 #### 3. PCIe初始化与资源分配流程 在现代计算机系统中,PCI Express(PCIe)逐渐取代了传统的PCI总线PCIe的资源分配流程更加复杂,涉及枚举、大小计算和实际分配等多个步骤[^2]。以下是关键步骤: - **枚举阶段**:通过`pci_acpi_scan_root()`函数扫描根复合体,并识别所有PCI设备。 - **大小计算阶段**:调用`pci_bus_size_bridges()`函数,使用深度优先递归算法确定各级PCI桥的基址/限制(Base/Limit)大小,并记录在`pci_dev->resource[PCI_BRIDGE_RESOURCES]`中。 - **分配阶段**:调用`pci_bus_assign_resources()`函数,完成对所有PCI设备资源(包括中断资源)的实际分配。 #### 4. 中断资源的具体管理 在Linux内核中,PCI中断资源的管理通常通过以下API实现[^4]: - `pci_request_regions(pci, "ICH HD audio")`:为指定的PCI设备分配资源区域。 - `pci_resource_start(pci, 0)`:获取设备的I/O端口地址。 - `pci_set_dma_mask(pci, DMA_BIT_MASK(32))`:设置设备的DMA掩码,确保其能够正确访问内存。 此外,还需要注意以下几点: - **子总线编号**:PCI桥的`primary bus number`、`secondary bus number`和`subordinate bus number`分别表示上游总线号、当前子树的最小总线号和最大总线号[^3]。这些编号对于正确分配中断资源至关重要。 - **中断屏蔽**:某些情况下,可以通过屏蔽板载设备(如声卡)来避免中断冲突。 ```python # 示例代码:PCI中断资源分配 import pci def allocate_interrupt_resource(pci_device): err = pci.pci_request_regions(pci_device, "Custom Chip") if err: print("Failed to allocate PCI regions") return -1 addr = pci.pci_resource_start(pci_device, 0) print(f"Allocated I/O port address: {addr}") dma_mask = pci.pci_set_dma_mask(pci_device, pci.DMA_BIT_MASK(32)) if not dma_mask: print("Failed to set DMA mask") return -1 return 0 ``` ### 结论 PCI中断资源的分配与管理需要综合考虑设备类型、使用场景以及系统的整体配置。通过合理规划和利用现有资源,可以有效减少中断冲突,提升系统性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值