计组与微机控制
8.1 PCI和AGP总线
8.1 PCI和AGP总线
图 7.1:典型 PCI 总线系统结构
图 7.1 画的是一个典型 PC 主板结构:

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 基本传输了。

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 可以这样读

一次 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 字节

前 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 配置空间里的状态和命令格式。

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 系统结构。

可以简化成:
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 图形时,为显卡单独设计的高速点对点接口。
