采用PIO方式访问硬盘,硬盘扇区数据的读写完全由CPU通过IN、OUT指令执行,一个扇区占512字节,需要256次I/O操作,占用CPU资源。读取硬盘扇区时,每次I/O操作包括一个IN指令和一个内存写操作,CPU先读取16位数据到AX中,再将16位数据写入到内存中。写入硬盘扇区时,每次I/O操作则包括一个内存读操作和一个OUT指令。
使用DMA方式,硬盘读写由DMA控制,数据在内存和I/O端口之间直接传输,而不需要CPU中转,传输速度比PIO方式快,降低了CPU的开销。
10.1 获取PCI-IDE配置
早期的IDE控制器挂接在ISA总线上,而目前主板上的芯片组一般都集成了一个PCI-IDE控制器,支持两个IDE通道。PCI-IDE控制器支持DMA功能,能够在IDE通道和内存之间建立直接的数据传输,而不必通过CPU。也就是说,PCI-IDE控制器可以作为总线主控设备,从IDE接口中读出数据写入到内存中(读扇区),或者从内存中读出数据写入到IDE接口中(写扇区)。
1. PCI-IDE控制器
如图10-1,PCI-IDE控制器就像一座桥梁一样,一端连接PCI总线,另一端连接IDE设备,能够在控制器中的DMA的指挥下,通过PCI总线在内存和IDE设备之间传输数据。
CPU |
PCI总线 |
内存 |
北桥、南桥 |
其它PCI设备 |
ATA设备 |
PCI-IDE控制器 |
IDE接口 |
2. PCI设备的配置空间
PCI具有即插即用的功能,支持自动的设备检测和配置。在系统启动时,操作系统扫描系统的各条PCI总线,枚举出总线上存在的PCI设备。操作系统读取PCI设备配置空间的寄存器,确定设备所需的地址空间、分配中断以及主设备对总线的访问要求等。
(1)总线、设备、功能
系统可以最多连接256条PCI 总线,每条PCI总线可以连接32个物理PCI设备。每个PCI设备可以包含一个到八个独立的PCI功能(即逻辑设备)。
(2)配置空间
对每一个功能,PCI设备都给它提供一个256字节的配置空间,由64个32位的配置寄存器组成。
图10-2显示了PCI功能配置空间中前面16个双字寄存器。这个区域的格式和用法由PCI规范定义,PCI设备必须按照PCI规范设置配置头区域有关字段。系统启动时,系统软件的配置程序读取配置头中的设备信息并根据设备的要求按照PCI规范配置设备。
31 |
16 |
15 |
0 |
|
设备ID |
供应商ID |
00H |
||
状态寄存器 |
命令寄存器 |
04H |
||
类代码 |
版本 |
08H |
||
内建自测 |
配置头类型 |
延迟时间 |
Cache行大小 |
0CH |
基地址寄存器0 |
10H |
|||
基地址寄存器1 |
14H |
|||
基地址寄存器2 |
18H |
|||
基地址寄存器3 |
1CH |
|||
基地址寄存器4 |
20H |
|||
基地址寄存器5 |
24H |
|||
卡总线指针 |
28H |
|||
子系统版本ID |
子系统供应商ID |
2CH |
||
扩展ROM基地址寄存器 |
30H |
|||
保留 |
性能指针 |
34H |
||
保留 |
38H |
|||
优先级请求 |
时间片请求 |
中断引脚 |
中断线 |
3CH |
图10-2 PCI配置空间头部的16个双字寄存器
供应商ID、设备ID、版本、类代码、子系统供应商ID、子系统版本ID,这6个寄存器用于识别设备类型,操作系统根据它们的内容,确定为设备装载哪个驱动程序。
•供应商ID:设备制造商的代码,由PCI SIG组织来分配。例如,值8086h代表Intel公司。
•设备ID:16位,由设备制造商分配,表示设备类型。例如,2416h代表Intel 82801AA (ICHAA) AC'97 Modem Controller。
•版本:8位,由设备制造商分配,表示设备的版本号。
•类代码:24位内容包含:基类型、子类型和可编程接口,每一项占1个字节。基类型代表设备的基本功能,设备子类型表示了该基类型中的设备的详细分类,可编程接口则表示该设备的寄存器编程接口。
·命令寄存器:提供了对设备响应和执行PCI访问能力的基本控制。
·状态寄存器:把功能的状态记录在PCI设备中。
·配置头类型:第6~第0位定义了配置空间头部的格式(00H=普通PCI设备,01H=PCI桥,02H=CardBus桥)。第7位定义了设备是单功能设备(=0)还是多功能设备(=1)。
·内建自测:BIST(Built-In Self-Test)寄存器,可以由主设备和/或目标设备提供,设置后,设备可以实现内置自检。延迟定时器也叫时间片寄存器,它对于执行猝发交易的主设备是强制性(可读/可写)。
·延迟时间:定义了以PCI时钟周期为单位的最小时间量,在这个时间片中,总线主设备只要起动一次新交易,就能保持总线所有权。起动交易后,总线主设备在每个时钟上升沿将延迟定时器减1。
·Cache行大小:用于存储器写和使失效命令,指出系统以双字为单位的Cache行大小(例如,一该寄存器的值为08h,表示Cache行容量为8个双字即32字节)。
·优先级请求:表示主设备访问总线的频度(多少时间访问总线一次,从仲裁器收到GNT #计算,250ns递增),决定总线仲裁器分配给主设备(假设仲裁器可编程)的优先级(以及仲裁器使用的仲裁方案)。
·时间片请求:由总线主设备提供,表示主设备要达到好的性能而希望保持PCI总线所有权的时间,指出设备进行一个猝发周期需要多长时间(以250ns为单位)。
·中脚引脚:指出功能连接了哪一个中断请求引脚。值01h到04h对应于PCI中断请求引脚INTA #至INTD #。
·中脚线:用于识别功能的PCI中断请求引脚(由中断引脚寄存器指定)连接到中断控制器的哪个输入端。
·基地址寄存器:为设备内的存储器和IO空间提供基地址的寄存器。第0位定义了该寄存器描述的是存储器(=0)还是I/O地址(=1)。存储器的基地址可以是64位的(第2-1位=10b),这时,使用2个基地址寄存器表示64位基地址。