I/O端口和I/O内存

CPU对外设IO端口物理地址的编址方式有两种:一种是I/O映射方式(I/Omapped,另一种是内存映射方式(Memorymapped.

有些体系结构的CPU(如,PowerPC、m68k等)通常只实现一个物理地址空间(RAM)。在这种情况下,外设I/O端口的物理地址就被映射到CPU的单一物理地址空间中,而成为内存的一部分。此时,CPU可以象访问一个内存单元那样访问外设I/O端口,而不需要设立专门的外设I/O指令。这就是所谓的"内存映射方式"(Memory-mapped)

 而另外一些体系结构的CPU(典型地如X86)则为外设专门实现了一个单独地地址空间,称为"I/O地址空间"或者"I/O端口空间"。这是一个与CPU地RAM物理地址空间不同的地址空间,所有外设的I/O端口均在这一空间中进行编址。CPU通过设立专门的I/O指令(如X86的IN和OUT指令)来访问这一空间中的地址单元(也即I/O端口)。这就是所谓的"I/O映射方式"(I/O-mapped)与RAM物理地址空间相比,I/O地址空间通常都比较小,如x86 CPU的I/O空间就只有64KB(0-0xffff)。这是"I/O映射方式"的一个主要缺点。

Linux将基于I/O映射方式的或内存映射方式的I/O端口通称为"I/O区域"(I/O region)

===============================================================================

1、外设都是通过读写设备上的寄存器来进行的,外设寄存器也称为"I/O端口",而IO端口有两种编址方式:独立编址统一编制。而具体采用哪一种则取决于CPU的体系结构。 如,PowerPC、m68k等采用统一编址,而X86等则采用独立编址。但对于Linux内核而言,它可能用于不同的CPU,所以它必须都要考虑这两种方式,于是它采用一种新的方法,将基于I/O映射方式的或内存映射方式的I/O端口通称为"I/O区域"(I/O region)不论你采用哪种方式,都要先申请IO区域:request_resource(),结束时释放它:release_resource()。
对于某一既定的系统,它要么是独立编址,也即
"I/O端口"方式,外设寄存器位于"I/O空间";要么是统一编制,也即"I/O内存"方式,外设寄存器位于"内存空间"(很多外设有自己的内存、缓冲区,外设的寄存器和内存统称"I/O空间")。

2、对外设的访问分为IO端口访问和IO内存访问。
访问
IO内存的流程是:request_mem_region() -> ioremap() -> ioread8()/iowrite8() -> iounmap() -> release_mem_region() 。
访问
IO端口2种途径,I/O映射方式(I/O-mapped)、内存映射方式(Memory-mapped)。前一种途径直接使用intb()/outb()之类的函数来读写IO端口,后一种是(为了达到接口的同一性)先把IO端口映射到IO内存("内存空间"):ioport_map(),再使用访问IO内存的函数来访问IO端口。

posted @ 2012-05-25 17:57  心随灵动  阅读(1145)  评论(0编辑  收藏  举报