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地址空间分配 | |
---|---|
端口地址范围 | 分配说明 |
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 |
对于使用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