IO地址类似设备的门牌号,每个设备都有自己唯一的地址。
除了IO地址之外,设备还可以通过IRQ 中断(Interrupt)和CPU直接沟通。
如果IO地址是设备的门牌号,那么IRQ就是各门牌连接到邮件中心(CPU)的专门路径! 设备可以透过IRQ中断来告知CPU该设备的工作情况,以方便CPU进行工作分配的任务。

1.IO端口和寻址

回到顶部

CPU为了访问IO接口控制器上的数据和状态信息,需要首先找到地址。这种地址称为IO端口地址,简称端口。 通常一个IO控制器包含访问数据的数据端口、输出命令的控制端口和访问控制器执行状态的状态端口。 端口地址一般有两种:统一编址和独立编址。
端口统一编址是把IO控制器的端口地址归入内存地址空间范围内,这种编址方式也称为存储器映射编址。 CPU使用访问内存的指令访问端口,端口操作与内存操作一样。
端口独立编址是把IO控制器的地址空间单独作为一个独立的地址空间,称为IO地址空间。 每个端口都有一个对应的IO地址,使用专门的IO指令来访问IO端口。
IBM PC及其兼容机主要使用独立编址方式,采用一个独立的IO地址空间对控制设备中的寄存器进行寻址和访问。
使用ISA总线结构的传统PC机IO地址空间范围是0x000-0x3FF,有1024个IO端口地址可供使用。 各控制器和控制卡所默认分配使用的端口地址范围见下表:

传统PC机IO地址空间分配
传统PC机IO地址空间分配
端口地址范围 分配说明
0x000-0x01f 8237A DMA控制器1
0x020-0x03f 8259A可编程中断控制器1
0x040-0x05f 8253/8254|A 定时计数器
0x060-0x06f 8042键盘控制器
0x070-0x07f 访问CMOS RAM/实时时钟RTC(Real Time Clock)端口
0x080-0x09f DMA页面寄存器访问端口
0x0a0-0x0bf 8259可编程中断控制器2
0x0c0-0x0df 8237A DMA控制器2
0x0f0-0x0ff 协处理器访问端口
0x170-0x177 IDE硬盘控制器1
0x1f0-0x1f7 IDE硬盘控制器2
0x278-ox27f 并行打印机端口2
0x2f8-0x2ff 串行控制器2
0x378-0x38f 并行打印机端口1
0x3b0-0x3bf 单色MDA显示控制器
0x3c0-0x3cf 彩色CGA显示控制器
0x3d0-0x3df 彩色EGA/VGA显示控制器
0x3f0-0x3f7 软盘控制器
0x3d0-0x3df 彩色EGA/VGA显示控制器
0x3f8-0x3ff 串行控制器1
另外,IBM PC机也部分地使用了统一编址方式。例如VGA显卡显示内存的地址就直接占用了内存储器地址空间0xB800-0xBC00范围。 因此若要让一个字符显示在屏幕上,可以直接使用内存操作指令往这个内存区域写入数据。
对于使用EISA或PCI等总线结构的现代PC机,有64KB的IO地址空间可供使用。 在Linux系统下通过查看/proc/ioports文件可以得到相关控制器的IO地址范围,如下所示:
              initroot@initroot:~$ sudo cat /proc/ioports
              0000-0cf7 : PCI Bus 0000:00
              0000-001f : dma1
              0020-0021 : pic1
              0040-0043 : timer0
              0050-0053 : timer1
              0060-0060 : keyboard
              0064-0064 : keyboard
              0070-0071 : rtc_cmos
              0070-0071 : rtc0
              0080-008f : dma page reg
              00a0-00a1 : pic2
              00c0-00df : dma2
              00f0-00ff : fpu
              0170-0177 : 0000:00:01.1
              0170-0177 : ata_piix
              01f0-01f7 : 0000:00:01.1
              01f0-01f7 : ata_piix
              0376-0376 : 0000:00:01.1
              0376-0376 : ata_piix
              03c0-03df : vga+
              03f6-03f6 : 0000:00:01.1
              03f6-03f6 : ata_piix
              0cf8-0cff : PCI conf1
              0d00-ffff : PCI Bus 0000:00
              4000-403f : 0000:00:07.0
              4000-4003 : ACPI PM1a_EVT_BLK
              4004-4005 : ACPI PM1a_CNT_BLK
              4008-400b : ACPI PM_TMR
              4020-4021 : ACPI GPE0_BLK
              4100-410f : 0000:00:07.0
              4100-4108 : piix4_smbus
              d000-d00f : 0000:00:01.1
              d000-d00f : ata_piix
              d010-d017 : 0000:00:03.0
              d010-d017 : e1000
              d020-d03f : 0000:00:04.0
              d100-d1ff : 0000:00:05.0
              d100-d1ff : Intel 82801AA-ICH
              d200-d23f : 0000:00:05.0
              d200-d23f : Intel 82801AA-ICH
              d240-d247 : 0000:00:0d.0
              d240-d247 : ahci
              d248-d24b : 0000:00:0d.0
              d248-d24b : ahci
              d250-d257 : 0000:00:0d.0
              d250-d257 : ahci
              d258-d25b : 0000:00:0d.0
              d258-d25b : ahci
              d260-d26f : 0000:00:0d.0
              d260-d26f : ahci
              

2.接口数据传输控制方式

回到顶部

PC机IO接口数据传输控制方式一般采用程序循环轮循方式、中断方式和DMA传输方式。
循环查询方式是指CPU通过在程序中循环查询指定设备控制器中的状态来判断是否可以与设备进行数据交换。 这种方式不需要过多硬件支持。使用和编程都比较简单,但是比较耗费CPU时间。 在多任务操作系统中除非等待时间极短或必须,否则就不应该使用这种方式。 在Linux内核中,只有在设备或控制器能够立刻返回信息时才会在很少的几个地方采用这种方式。
中断处理控制方式需要有中断控制器的支持。在这种控制方式下,只有当IO设备通过中断向CPU提出处理请求时, CPU才会暂时中断当前执行的程序转而去执行相应的IO中断处理服务程序。 当执行完中断处理服务程序后,CPU又会执行刚才被中断的程序。 在IO控制器或设备发出中断请求时,CPU通过使用中断向量表(或中断描述符表)来寻址相应的中断处理服务程序的入口地址。 因此采用中断控制方式时需要首先设置好中断向量表,并编制好相应的中断处理服务程序。
Linux操作系统中大多数设备IO控制都采用中断处理方式。
直接存储器访问DMA(Direct Memory Access)方式用于IO设备与系统内存之间进行批量数据传送, 整个操作过程需要使用专门的DMA控制器来进行而无需CPU插手。由于在传输过程中无须软件介入,因此操作效率非常高。 在Linux操作系统中,软盘驱动程序使用中断和DMA方式配合来实现数据的传输工作。

3.cpu内存寻址空间

回到顶部

寻址空间一般指的是CPU内存寻址的能力。 通俗的说,就是能最多用到多少内存的一个问题。 数据在存储器(RAM)中存放是有规律的,CPU在运算的时候需要把数据提取出来就需要知道数据在哪里,寻找数据的过程就叫做寻址。 如果地址太多超出了CPU的能力范围,CPU就无法找到数据了。 CPU最大能查找多大范围的地址叫做寻址能力,CPU的寻址能力以字节为单位。
通常认为,内存容量越大处理数据的能力也就越强,但受系统结构、硬件设计、制造成本等多方面因素的制约,内存容量不能无限大, 一个最直接的因素取决于系统的地址总线的地址寄存器的位数宽度。 计算机的寻址范围是由总线宽度(处理器的地址总线的位数)决定的,也可以理解为CPU寄存器位数,这二者一般是匹配的。
地址总线为N位(N通常都是8的整数倍,也说N根数据总线)的CPU寻址范围是2的N次方字节,即2^N(Byte)。
Intel早期的CPU地址总线和地址寄存器的宽度为20位,即CPU的寻址能力为2^20=1024*1024=1M字节。 386及386以上的地址总线和地址寄存器的宽度为32位,CPU的寻址能力为2^32=4096M字节=4G字节。

initroot编辑整理,转载请注明www.initroot.com