I/O端口与内存地址

外设都是通过读写设备上的寄存器来进行的,外设寄存器也称为"I/O端口",而IO端口有两种编址方式:独立编址和统一 编制。而具体采用哪一种则取决于CPU的体系结构。

独立编址:"I/O映射方式"

内存和外设分开独立编址(它们的地址原则上可以有重合区域);因为独立,所以内存编址可以从0~N,外设编址也可以从0~N; 这就是所谓的"I/O映射方式"(I/O-mapped),也就是“独立编址”。 而X86等则采用独立编址.

统一编址:  内存映射方式"(Memory-mapped)

就是内存和外设的编址放到一起来规划,被外设用了的地址就不能给内存了,反之亦然! 比如:给外设分配地址0~N,那么内存就不能使用0~N了,只能使用N~M!这就是所 谓的"内存映射方式"(Memory-mapped)。优点是CPU就可以像访问一个内存单元那样访问外设I/O端口(理解为I/O寄存器),而不需要设立专门的外设I/O指令。

 针对PCI设备的访问,独立编址和统一编址的的区别在于:独立编址访问外设有专门的I/O指令(比如:x86的in/out等指令),而统一编址对外设的访问和都内存的访问指令可以是一样的(这样使用起来更方便)!

在不同的系统中,I/O端口的地址编排有两种形式:存储器统一编址和I/O独立编址。 存储器统一编址(存储器映像编址):在这种编址方式中,I/O端口和内存单元统一编址,即把I/O端口当作内存单元对待,从整个内存空间中划出一个子空间给I/O端口,每一个I/O端口分配一个地址码,用访问存储器的指令对I/O端口进行操作。

 存储器统一编址的优点是:I/O端口的数目几乎不受限制;访问内存指令均适用于I/O端口,对I/O端口的数据处理能力强;cpu无需产生区别访问内存操作和I/O操作的控制信号,从而可减少引脚。

存储器统一编址缺点是:程序中I/O操作不清晰,难以区分程序中的I/O操作和存储器操作;I/O端口占用了一部分内存空间;I/O端口地址译码电路较复杂(因为内存的地址位数较多)。I/O独立编址:I/O端口编址和存储器的编址相互独立,即I/O端口地址空间和存储器地址空间分开设置,互不影响。采用这种编址方式,对I/O端口的操作使用输入/输出指令(I/O指令)。I/O独立编址的优点是:不占用内存空间;使用I/O指令,程序清晰,很容易看出是I/O操作还是存储器操作;译码电路比较简单(因为I/0端口的地址空间一般较小,所用地址线也就较少)。

I/O独立编址缺点是:只能用专门的I/O指令,访问端口的方法不如访问存储器的方法多。编址总概:上面两种编址方式各有优点和缺点,究竟采用哪一种取决于系统的总体设计。在一个系统中也可以同时使用两种方式,前提是首先要支持I/O独立编址。如:Intel的x86微处理器支持I/O独立编址,因为它们的指令系统中都有I/O指令,并设置了可以区分I/O访问和存储器访问的控制信号引脚。而一些微处理器或单片机,为了减少引脚,从而减少芯片占用面积,不支持I/O独立编址,只能采用存储器统一编址。编址的方法分为统一编址与独立编址: 统一编址的原理是将IO的端口地址存储器寻址的地址空间范围之内,此方法也成为存储器映像编址。CPU访问一个端口的操作与访问内存的操作相同,也使用访问内存的指令。独立编址是为端口地址单独开辟一部分地址空间,其访问指令也需要使用单独的指令(不同于内存访问指令)。

例如:CGA显示卡的内存地址直接编入内存地址空间范围,0xB800-0xBC00范围内,想在显示器上输出一个字符,可以直接使用内存操作指令进行操作。采用独立的IO地址空间对控制设备中的寄存器进行寻址与访问。使用ISA总线结构的传统PC机其IO地址范围是0x000-0x3ff,共1024个。普通Linux下查看/proc/ioports文件可得到相关控制器或设置使用的IO地址范围。计算机控制系统中,存储器和I/O接口都接到CPU的同一数据总线上。当CPU与存储器和I/O接口进行数据交换时,就涉及到CPU与哪一个I/O接口芯片的哪一个端口联系,还是从存储器的哪一个单元联系的地址选择问题,即寻址问题。这涉及I/O接口的编址方式,通常有两种编址方式,一种是I/O接口与存储器统一编址,另一种是I/O接口独立编址。

一、I/O接口独立编址方式这种编址方式是将存储器地址空间和I/O接口地址空间分开设置,互不影响。设有专门的输入指令(IN)和输出指令(OUT)来完成I/O操作,例如Z80微处理器的I/O接口是按独立编址方式的,它利用MREQ和IORQ信号来区分是访问存储器地址空间还是I/O接口地址空间,利用读、写操作信号、区分是读操作还是写操作。存储器的地址译码使用16位地址(A0~A15),可以寻址64KB的内存空间,而I/O接口的地址译码仅使用地址总线的低8位(A0~A7),可以寻址256个I/O端口地址空间。8086微处理器的I/O接口也是属于独立编址方式的。它允许有64K个8位的I/O端口,两个编号相邻的8位端口可以组合成一个16位端口。指令系统中既有访问8位端口的输入输出指令,也有访问16位端口的输入输出指令。8086输入输出指令可以分为两大类:一类是直接的输入输出指令,(如INAL,55H;OUT70H,AX),另一类是间接的输入输出指令(如INAX,DX;OUTDX,AL),在执行间接输入输出指令前,必须在DX寄存器中先设置好访问端口号。

二、I/O接口与存储器统一编址方式这种编址方式不区分存储器地址空间和I/O接口地址空间,把所有的I/O接口的端口都当作是存储器的一个单元对待,每个接口芯片都安排一个或几个与存储器统一编号的地址号。也不设专门的输入/输出指令,所有传送和访问存储器的指令都可用来对I/O接口操作。M6800和6502微处理器以及Intel51系列的51、96系列单片机就是采用I/O接口与存储器统一编址的。

两种编址方式有各自的优缺点,独立编址方式的主要优点是内存地址空间与I/O接口地址空间分开,互不影响,译码电路较简单,并设有专门的I/O指令,所编程序易于区分,且执行时间短,快速性好。其缺点是只用I/O指令访问I/O端口,功能有限且要采用专用I/O周期和专用的I/O控制线,使微处理器复杂化。统一编址方式的主要优点是访问内存的指令都可用于I/O操作,数据处理功能强;同时I/O接口可与存储器部分公用译码和控制电路。

其缺点是:I/O接口要占用存储器地址空间的一部分;因不用专门的I/O指令,程序中较难区分I/O操作。I/O接口的编址方式是由所选定的微处理器决定了的,接口设计时应按所选定的处理器所规定的编址方式来设计I/O接口地址译码器。但是独立编址的微处理器的I/O接口也可以设计成统一编址方式使用,如在8086系统中,就可通过硬件将I/O接口的端口与存储器统一编址。这时应在信号或者号有效的同时,使M/信号处于高电平,通过外部逻辑组合电路的组合,产生对存储器的读、写信号,CPU就可以用功能强、使用灵活方便的各条访内指令来实现对I/O端口的读、写操作。

你可能感兴趣的:(计算机系统结构理解)