← 返回 计组与微机控制

计组与微机控制

8.1 PCI和AGP总线

8.1 PCI和AGP总线

图 7.1:典型 PCI 总线系统结构

图 7.1 画的是一个典型 PC 主板结构:

8.1 PCI和AGP总线 图 1

CPU │ 北桥 NB │ ├── 内存 DIMM ├── AGP → VGA 显卡 └── PCI BUS 32bit / 33MHz ├── SCSI ├── LAN ├── PCI-PCI Bridge └── 南桥 SB ├── USB ├── IDE └── ISA BUS ├── BIOS └── Super I/O

可以这样理解:

北桥:连接高速部分,比如 CPU、内存、AGP、PCI 南桥:连接低速外设,比如 USB、IDE、ISA、BIOS、串口并口等

这其实就是老式 PC 的经典“南北桥结构”。

重点不是图,而是它体现了一个思想:

PCI 不是直接取代所有总线,而是作为高速局部总线,通过桥接芯片连接 CPU 总线和低速外设总线。

所以前面说 PCI 和 ISA/EISA 不兼容,但可以通过桥接芯片共存。

2. PCI 的几个核心能力

教材这一段说 PCI 有这些能力:

1. 完全的多总线主控能力 2. 自动识别外设,即插即用 PnP 3. 中断共享 4. 突发传输 5. 较高的数据传输率

其中最重要的是这三个:多主控,即插即用,中断共享

这三个也是 PCI 比 ISA 先进的关键。

3. PCI 的多总线主控

3.1 什么叫“总线主控”?

在一次总线传输中,主动发起访问的一方叫:Master,主设备

被访问的一方叫:Slave,目标设备 / 从设备,也就是我们常说的主机和从机,和计网的主机不一样嗷

比如网卡要把数据直接写入内存,网卡就可以成为 Master,内存控制器或桥接设备作为目标。

这比 ISA 更强。ISA 时代通常 CPU 控制很多事情,外设想主动传输很麻烦。PCI 允许外设自己申请总线控制权。

3.2 为什么需要仲裁器 Arbiter?

PCI 总线上可能有多个设备都想当 Master:

网卡想传数据 SCSI 控制器想传数据 声卡想传数据 PCI-PCI Bridge 也想传数据

但是同一时刻 PCI 总线只能被一个 Master 使用。

所以需要仲裁器:Arbiter:决定谁获得 PCI 总线使用权。

设备申请总线时用:REQ#:Request,总线请求

仲裁器允许它使用总线时用:GNT#:Grant,总线授权

注意这里的 # 通常表示低电平有效。也就是说:

REQ# = 0:设备请求总线 GNT# = 0:仲裁器授权设备使用总线

4. 图 7.2:PCI 总线一次基本传输过程

这个图很重要,理解它就理解 PCI 基本传输了。

8.1 PCI和AGP总线 图 2

PCI 传输主要涉及这些信号:

CLK 时钟 FRAME# 帧信号,表示一次传输开始/持续 AD 地址/数据复用总线 C/BE# 命令/字节使能复用信号 IRDY# 发起方准备好 TRDY# 目标方准备好 DEVSEL# 目标设备选中

4.1 AD 总线:地址和数据复用

PCI 的 AD 总线不是单纯地址线,也不是单纯数据线,而是:Address / Data 地址 / 数据复用线

传输开始时:AD 上传地址

后续阶段:AD 上传数据

所以一次 PCI 传输一般分成:地址阶段 + 数据阶段

这和 8086 的 AD0~AD15 有点像,也是复用思想。

4.2 C/BE# 总线:命令和字节使能复用

C/BE# 也复用。地址阶段时:C/BE# 上传命令

比如说明这次是:

内存读 内存写 I/O 读 I/O 写 配置读 配置写

数据阶段时:C/BE# 变成 Byte Enable,字节使能

也就是告诉目标设备,这次数据总线上的哪些字节有效。

4.3 FRAME#:一次传输开始和结束的标志

当 Master 获得总线后,会把:FRAME# 拉低

表示:我要开始一次 PCI 总线传输了。

在传输还没结束时,FRAME# 保持低电平。

当 Master 准备结束,只剩最后一个数据阶段时,会把:FRAME# 拉高

表示:这是最后一组数据了。

所以可以这样记:

FRAME# 低:传输正在进行 FRAME# 高:传输即将结束或已经结束

4.4 DEVSEL#:目标设备选中

Master 在 AD 总线上放地址后,总线上的各个设备都会进行地址译码。

如果某个设备发现:这个地址属于我

它就把:DEVSEL# 拉低

表示:我就是这次访问的目标设备。

如果没有设备响应,说明地址无效或者设备不存在。

4.5 IRDY# 和 TRDY#:双方都准备好才能传输

PCI 数据传输有一个非常关键的规则:

只有 IRDY# 和 TRDY# 都为低电平时,数据才真正传输。

其中:

IRDY#:Initiator Ready,主设备准备好 TRDY#:Target Ready,目标设备准备好

所以:IRDY# = 0 且 TRDY# = 0 → 本拍完成一次数据传输

如果其中任意一个不是低电平,就要等待。

比如:IRDY# = 0,TRDY# = 1

说明主设备准备好了,但目标设备还没准备好,于是等待。

又比如:IRDY# = 1,TRDY# = 0

说明目标设备准备好了,但主设备还没准备好,也等待。

这就是图里的 WAIT。

4.6 图 7.2 可以这样读

8.1 PCI和AGP总线 图 3

一次 PCI 读写过程大致是:

1. Master 申请总线,获得 GNT#。 2. Master 拉低 FRAME#,开始传输。 3. AD 总线上放目标地址。 4. C/BE# 总线上放命令类型。 5. 目标设备译码地址,如果命中,拉低 DEVSEL#。 6. 进入数据阶段,AD 总线上传 DATA-1、DATA-2、DATA-3…… 7. 每一拍只有 IRDY# 和 TRDY# 都有效时,数据才传输。 8. 如果有一方没准备好,就插入等待周期 WAIT。 9. Master 拉高 FRAME#,表示最后一个数据阶段。 10. 最后一个数据传输完成后,IRDY# 拉高,释放总线。

一句话总结:PCI 的每个数据传输周期,需要主设备和目标设备双方握手确认。

5. PCI 的传输效率

书上说 PCI 传输效率很高。

对于 32 位、33 MHz 的 PCI:33 MHz × 32 bit ÷ 8 = 132 MB/s

所以理论峰值:132 MB/s

但实际中由于等待周期、仲裁、地址阶段、设备响应等开销,达不到满速。书上说实际连续传输一般可以做到:约 100 MB/s

所以要区分:理论峰值:132 MB/s。实际常见:约 100 MB/s

6.1 ISA 为什么麻烦?

老 ISA 设备经常要手动设置:I/O 地址 中断号 IRQ DMA 通道 内存地址

以前常见方式是:跳线帽 DIP 开关 手动配置驱动

所以容易出现资源冲突,比如两个设备都用 IRQ5。

6.2 PCI 怎么解决?

PCI 设备内部有一块专门的配置空间:Configuration Space配置空间

里面保存了设备的信息,例如:

设备识别码 厂商识别码 设备类型 基地址寄存器 中断引脚 中断线 扩展 ROM 地址 状态/命令寄存器

系统启动时,BIOS 或操作系统可以读取这些配置寄存器,然后自动分配资源。

这就是:PnP,即插即用

可以理解成:PCI 设备会主动告诉系统:我是谁,我需要多少地址空间,我要用什么中断。

系统再告诉它:

你使用这个内存地址范围; 你使用这个 I/O 地址; 你使用这个 IRQ。

7. PCI 中断共享

7.1 ISA 的问题:中断独占

ISA 卡的一个重要限制是:中断资源基本是独占的。

比如某块 ISA 卡用了 IRQ5,另一块卡也要用 IRQ5,就容易冲突。

7.2 PCI 可以中断共享

PCI 支持多个设备共享同一条中断线。硬件上,它采用类似“线与”的思想:

平时中断线被上拉为高电平; 某个设备请求中断时,把中断线拉低; 只要还有设备保持中断请求,中断线就保持低; 所有设备都释放后,中断线才恢复高电平。

软件上,则采用中断链:多个设备的中断服务程序串成一条链。

比如设备 A 和设备 B 都共享中断 5。

系统发现中断 5 来了以后,先进入某个 ISR,例如:ISR_INT_B

它检查是不是设备 B 发的中断。

如果是:处理设备 B,然后清除设备 B 的中断请求。

如果不是:跳到 ISR_INT_A,继续检查设备 A。

这就是中断共享的本质:

硬件上共享中断线; 软件上逐个检查到底是谁发出的中断。

8. PCI 配置寄存器

这一节非常重要,因为它解释了 PCI 为什么能自动配置。

8.1 每个 PCI 设备有 256 字节配置空间

每个 PCI 接口都有:256 字节配置寄存器空间

每 4 个字节组成一个 32 位寄存器,所以:256 ÷ 4 = 64

也就是:64 个 32 位配置寄存器

其中:前 64 字节:预定义区域 / 标题区 后 192 字节:设备相关的特殊配置区域

即:

00H ~ 3FH:标准配置头 40H ~ FFH:设备自定义配置空间

8.2 图 7.3:配置空间前 64 字节

8.1 PCI和AGP总线 图 4

前 64 字节里最重要的字段有:

00H:设备识别码、厂商识别码 04H:状态寄存器、命令寄存器 08H:类别码、修订号 0CH:BIST、标题类型、等待时间、CLS 10H 起:基地址寄存器 BAR 30H:扩展 ROM 基地址 3CH 附近:INT-Line、INT-Pin、MinGNT、MaxLat

9. 设备识别码和厂商识别码

9.1 Vendor ID:厂商识别码

厂商识别码由 PCI SIG 分配,用来区分厂家。

例如书上提到:

Motorola:1057H EPSON:1008H Intel:8086H

Intel 的 Vendor ID 很好记:8086H

因为 Intel 经典 CPU 就是 8086。

9.2 Device ID:设备识别码

设备识别码由厂家自己定义,用来区分同一厂商下的不同设备。

如果设备识别码为:FFFFH

一般表示:没有安装设备 / 没有设备响应。

所以系统扫描 PCI 设备时,可以通过读取 Vendor ID 和 Device ID 判断设备是否存在。

10. 状态寄存器和命令寄存器

图 7.4 讲的是 PCI 配置空间里的状态和命令格式。

8.1 PCI和AGP总线 图 5

10.1 状态寄存器 Status

状态寄存器主要反映设备当前状态,比如:

是否发生奇偶校验错误 是否发生系统错误 是否目标异常终止 是否支持快速周期 设备选择响应速度 数据校验错误

简单说:状态寄存器 = 设备告诉系统“我现在有没有异常、支持什么能力”。

10.2 命令寄存器 Command

命令寄存器用来控制设备是否允许某些功能,比如:

是否允许 I/O 空间访问 是否允许内存空间访问 是否允许总线主控 是否允许特殊周期 是否允许中断相关功能

简单说:命令寄存器 = 系统告诉设备“你可以做什么”。

最常见的几个控制位:

I/O Space Enable:允许 I/O 地址访问 Memory Space Enable:允许内存地址访问 Bus Master Enable:允许设备成为总线主设备

比如一块网卡如果要 DMA,把数据直接写入内存,就必须允许:Bus Master

否则它不能主动控制 PCI 总线。

11. 类别码和修订号 类别码用来表示设备属于哪一类。

比如:

0100H:SCSI 控制器 0101H:IDE 控制器 0200H:以太网控制器 0300H:VGA 控制器 0400H:视频多媒体 0401H:音频多媒体 0500H:RAM 控制器 0600H:主机桥 0601H:ISA 桥 0602H:EISA 桥 0604H:PCI-PCI 桥 FFFFH:其他类别设备

类别码的作用:让系统知道这个 PCI 设备大概是什么类型。

例如系统读到类别码:0200H

就知道它是:以太网控制器

这样系统就能加载对应类型的驱动。

12. BIST:内部自测

BIST 是:Built-In Self Test内部自测

它用于判断设备是否支持自测、是否执行自测,以及自测结果。

记忆方式:BIST = 设备自己检查自己有没有问题。

如果自测完成后状态码为 0,一般表示:没有错误

13. Header Type:标题类型

标题字段定义配置空间头部格式。

其中一个重要位表示:该设备是不是多功能设备

多功能设备就是一个 PCI 设备里面集成多个功能,比如:

声卡 + 游戏端口 网卡 + 管理功能 显卡 + 音频输出

如果最高有效位为 1,表示:多功能设备

14. CLS:高速缓存行大小

CLS 是:Cache Line Size 高速缓存行大小

它定义设备使用的缓存行单位大小。这个和突发传输、缓存一致性等有关。

一般考试不太深入,记一句:

CLS 字段定义高速缓存行大小。

15. Latency Timer:等待时间 / 延迟计时器

教材说等待时间字段定义 PCI 总线操作所需时间。

可以理解成:一个设备获得 PCI 总线后,最多可以连续占用多长时间。

这样可以避免某个设备长时间霸占总线,导致其他设备饿死。

16. BAR:基地址寄存器

BAR 是 PCI 配置空间里非常重要的字段。

全称:Base Address Register基地址寄存器

它的作用是:保存设备需要映射到系统中的地址。

PCI 设备可能需要:

内存地址空间 I/O 地址空间 扩展 ROM 地址空间

比如显卡、网卡、声卡等设备内部都有寄存器,CPU 要访问这些寄存器,就需要给它们分配地址。

16.1 内存 BAR

内存基地址格式中,最低几位不是地址,而是属性位。

大概意思是:

bit0:区分内存空间还是 I/O 空间 bit1~bit2:地址类型 bit3:是否可预取 Prefetchable 高位:真正的基地址

教材图里提到:

00:任意 32 位地址 01:小于 1 MB 10:任意 64 位地址 11:保留

所以 BAR 不只是存地址,还包含一些属性信息。

16.2 I/O BAR

I/O 空间的 BAR 也类似,低位表示类型,其他高位表示 I/O 基地址。

标准 PC 的 I/O 地址范围是:0000H ~ 0FFFFH

也就是:64 KB I/O 空间

但 PCI 本身可以支持更大的 32 位或 64 位寻址。

17. 扩展 ROM 基址

PCI 设备可以带扩展 ROM,比如:

显卡 BIOS 网卡启动 ROM SCSI 控制器 BIOS

扩展 ROM 基址字段用于指定:

扩展 ROM 映射到内存地址空间的哪里。

18. INT-Line 和 INT-Pin

18.1 INT-Pin

INT-Pin 表示设备使用 PCI 插槽上的哪根中断引脚:

INTA# INTB# INTC# INTD#

教材说:

0 表示没有中断 1 表示使用 INTA# 2 表示使用 INTB# 依此类推

18.2 INT-Line

INT-Line 表示设备最终连接到系统的哪条 IRQ 线上。

例如:IRQ0 ~ IRQ15

PCI 桥可以把 PCI 的 INTA#~INTD# 映射到合适的 IRQ 上。

所以:

INT-Pin:设备自己用哪根 PCI 中断引脚 INT-Line:系统最后分配到哪条 IRQ

这个区别很重要。

19. PCI 设备配置方式

教材讲了两种配置方式。

19.1 配置方式一:用 CF8H 和 CFCH

这是传统 PCI 配置访问方式。

两个标准端口:

0CF8H:配置地址寄存器 0CFCH:配置数据寄存器

使用过程:

先往 0CF8H 写入要访问的 PCI 总线号、设备号、功能号、寄存器号; 再从 0CFCH 读/写对应配置数据。

你可以理解为:

0CF8H 负责“选中哪个 PCI 配置寄存器” 0CFCH 负责“真正读写数据”

配置地址寄存器里通常包含:

Enable 位 PCI 总线号 PCI 设备号 PCI 功能号 寄存器号 访问类型

19.2 配置方式二:映射到 I/O 空间

第二种方式是把 PCI 配置空间映射到:

0C000H ~ 0CFFFH

也就是一个 4 KB 的 I/O 地址区域。

激活后,这段 I/O 地址就不是普通 I/O 端口了,而是用于访问 PCI 配置空间。

教材这里重点不是让你会写程序,而是知道:

PCI 设备可以通过标准机制访问配置空间,从而实现自动配置。

20. PCI 总线的发展:PCI-X

传统 PCI 后来带宽不够了。

原因很简单:

CPU 越来越快 网卡、磁盘控制器、IEEE 1394 等高速设备越来越多 传统 PCI 共享带宽不够用

书上举例:

一块 32 位千兆以太网卡约需要 125 MB/s 传统 32 位 33 MHz PCI 理论只有 133 MB/s

也就是说,一块千兆网卡就快把 PCI 带宽吃满了。

所以 Intel 推出了:PCI-X

可以这样整理:

注意:PCI-X 主要是服务器、高性能 I/O 使用的 PCI 扩展标准。

不要和 PCI Express 混淆。PCI-X 仍然是传统并行 PCI 的增强版;PCIe 是后来完全不同的串行点对点结构。

21. AGP 总线

AGP 全称:Accelerated Graphics Port加速图形接口

它是为了显卡设计的高速图形接口。严格说,AGP 不是普通共享总线,而是:

芯片组和显卡之间的点对点连接。

21.1 为什么需要 AGP?

早期显卡挂在 PCI 上。但是 3D 图形越来越复杂,需要大量纹理数据、Z 缓冲数据、Alpha 混合数据等。

如果这些数据都通过 PCI 传输,就会很容易堵塞 PCI 总线。

教材举例说,显示:1024 × 768 × 16 位真彩色 3D 图形

纹理数据传输速度需要 200 MB/s 以上,而传统 PCI 最高只有:133 MB/s

所以 PCI 成了瓶颈。

21.2 表 7.6:3D 绘图所需带宽

表中大概意思是,分辨率越高,所需带宽越大。

其中带宽主要被这些操作消耗:

显示器输出 显示内存刷新 Z 缓冲存取 纹理存取 其他操作

所以 AGP 的出现就是为了解决:

PCI 显卡带宽不足的问题。

22. AGP 的系统结构

图 7.6 表示 AGP 系统结构。

8.1 PCI和AGP总线 图 6

可以简化成:

CPU │ 图形/存储器控制器/PCI 桥 │ ├── 系统内存 ├── AGP → 图形显示卡 → 显示存储器 └── PCI → 普通 I/O 设备

关键思想:AGP 在主内存和显卡之间提供直接通道。

这样 3D 图形数据可以不经过传统 PCI 总线,而是通过 AGP 直接进入显示子系统。

23. AGP 的性能特点

教材说 AGP 以:66 MHz PCI Rev 2.1

为基础进行了扩展。

主要功能有:

1. 数据读写的流水线操作 2. 2X、4X、8X 数据传输倍率 3. 允许显卡访问主存中的纹理数据 4. 提供比 PCI 更高的图形数据带宽

23.1 流水线操作

流水线的意思是:上一笔数据还在传输时,下一笔访问请求已经可以提前发出。

普通方式像这样:

请求1 → 等待 → 数据1 请求2 → 等待 → 数据2 请求3 → 等待 → 数据3

流水线方式像这样:

请求1 → 请求2 → 请求3 数据1 → 数据2 → 数据3

这样可以减少等待时间,提高吞吐率。

23.2 AGP 的 1X、2X、4X、8X

AGP 传输率从 PCI 的 133 MB/s 提高到:

1X:266 MB/s 2X:533 MB/s 4X:1066 MB/s 8X:2133 MB/s

这里要注意:

AGP 的 1X 不是 133 MB/s,而是 266 MB/s。

因为 AGP 基于 66 MHz、32 位数据宽度:

66 MHz × 32 bit ÷ 8 = 266 MB/s

2X、4X、8X 是在这个基础上提高传输倍率。

24. PCI 和 AGP 的区别

这是考试很常考的对比。

一句话:PCI 是通用高速总线,AGP 是显卡专用高速接口。

25.复习:系统总线 1. EISA ISA 的 32 位扩展,兼容 ISA 2. PCI Intel 推出的局部总线 32/64 位,33/66 MHz 支持多总线主控、即插即用、中断共享 通过配置空间实现自动配置 3. AGP 显卡专用点对点图形接口 解决 PCI 显卡带宽不足 支持 1X/2X/4X/8X

26.简答题

题 1:PCI 总线为什么能即插即用?

答题模板:

PCI 设备内部具有配置空间,配置空间中保存了厂商识别码、设备识别码、类别码、基地址寄存器、中断引脚、中断线等信息。系统启动时,BIOS 或操作系统读取这些配置寄存器,识别设备类型,并自动分配 I/O 地址、内存地址和中断资源,再写入相应配置寄存器,因此 PCI 能实现即插即用。

题 2:PCI 总线一次传输的基本过程是什么?

答题模板:

PCI 主设备先通过 REQ# 向仲裁器申请总线,得到 GNT# 后获得总线控制权。随后主设备拉低 FRAME#,在 AD 总线上放置目标地址,在 C/BE# 总线上放置命令。目标设备译码地址后拉低 DEVSEL# 表示选中。进入数据阶段后,AD 总线传输数据,C/BE# 表示字节使能。只有 IRDY# 和 TRDY# 同时有效时,数据才完成一次传输。主设备在最后一个数据阶段前撤销 FRAME#,传输结束后释放总线。

题 3:PCI 如何实现中断共享?

答题模板:

PCI 采用硬件和软件结合的方式实现中断共享。硬件上,中断线平时被上拉为高电平,多个设备可共享同一中断线,某设备请求中断时将该线拉低。软件上,系统为共享同一中断的设备建立中断服务程序链,中断发生后依次调用各设备的中断服务程序,由程序判断是否为本设备产生的中断,并完成处理。这样多个 PCI 设备可以共享同一中断资源。

题 4:PCI 和 ISA 相比有什么优点?

答题模板:

PCI 总线比 ISA 总线具有更高的数据传输率,支持 32 位或 64 位数据传输,支持突发传输、多总线主控、即插即用和中断共享。PCI 设备具有配置空间,系统可以自动识别设备并分配资源,而 ISA 设备通常需要手动配置 I/O 地址、中断号和 DMA 通道。因此 PCI 更适合高速外设和现代计算机系统。

题 5:为什么需要 AGP?

答题模板:

随着 3D 图形处理的发展,显示卡需要传输大量纹理数据、Z 缓冲数据和显示数据,而传统 PCI 总线带宽有限,多个设备共享 PCI 总线时容易形成瓶颈。AGP 是专门为图形显示设计的点对点高速接口,在主存和显卡之间提供直接通道,并支持流水线操作和 1X、2X、4X、8X 等高速传输模式,因此可以提高 3D 图形处理性能。

27. 一句话总括这几页

PCI 通过多主控、握手传输、配置空间、中断共享实现了比 ISA 更高速、更自动化的总线体系;AGP 则是在 PCI 带宽不够支撑 3D 图形时,为显卡单独设计的高速点对点接口。