日期:2014-05-16  浏览次数:20698 次

Linux设备I/O (一)

一、外设的访问

几乎每一种外部设备都是通过读写设备上的寄存器来进行访问的,这些寄存器分为控制寄存器、状态寄存器和数据寄存器,而且一个外设的寄存器通常被连续编址。外部寄存器也成为"I/O端口"。

二、外设的编址方式

CPU对外设IO端口物理地址的编址方式有两种:一种是I/O映射方式(I/O-mapped),另一种是内存映射方式(Memory-mapped)。而具体采用哪一种则取决于CPU的体系结构。

(1)X86(I/O-mapped)

为外设专门实现了一个单独地地址空间,称为“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映射方式”的一个主要缺点。

(2)ARM(Memory-mapped)

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

三、linux下对I/O端口的访问

Linux将基于I/O映射方式的或内存映射方式的I/O端口通称为“I/O区域”(I/O region),IO区域是基于IO资源(Resource)来实现的。linux对I/O端口映射和I/O内存映射提供了不同的操作函数。对于I/O内存映射,为了提高兼容性,linux也为这些平台提供了I/O端口操作函数,他们实际上还是通过访问I/O内存映射地址来访问的,因此,不管你的程序是使用IO端口映射还是IO内存 映射,它都可以很好的运行到各种平台上。