I/O,即输入输出端口,一般设备都会有专有的I/O地址,用来处理自己的输入输出信息,比如串口1一般用的是3F8h-3FFh,在X86架构下,I/O设备种类较多,因此本节主要介绍一下X86架构下的I/O空间, ISA I/O, 以及Supper I/O, CMOS等IO 设备的访问方式以及实现方法。
1.I/O空间
外设中的寄存器被称为
I/O端口
,外设中的内存被称为
I/O内存
。二者合起来统称为
I/O空间
。
图1 I/O空间
1.1 I/O端口及寻址方式
备驱动程序要直接访问外设或其接口卡上的物理电路,这部分通常都是以寄存器的形式出现。外设寄存器称为I/O端口,通常包括:控制寄存器、状态寄存器和数据寄存器三大类。
根据访问外设寄存器的不同方式,可以把 CPU分成两大类。
一类CPU(如M68K,Power PC,ARM,Unicore等)把这些寄存器看作内存的一部分,寄存器参与内存统一编址,访问寄存器就通过访问一般的内存指令进行,所以,这种CPU没有专门用于设备I/O的指令(可以以此判定体系为哪种)。这就是所谓的“I/O内存”方式。即统一编址。
另一类CPU(如X86)将外设的寄存器看成一个独立的地址空间,所以访问内存的指令不能用来访问这些寄存器,而要为对外设寄存器的读/写设置专用指令,如IN和OUT指令。这就是所谓的“I/O端口”方式 。即独立遍址。 CPU是i386架构的情况在i386系列的处理中,内存和外部IO是独立编址,也是独立寻址的。MEM的内存空间是32位可以寻址到4G,IO空间是16位可以寻址到64K。 本文主要聚焦在这类遍址方式上。X86架构下,对应的专用指令 IN, OUT。在C语言中,封装成inp,inpw,inpd, 和outp,outpw,outpd函数。
一类CPU(如M68K,Power PC,ARM,Unicore等)把这些寄存器看作内存的一部分,寄存器参与内存统一编址,访问寄存器就通过访问一般的内存指令进行,所以,这种CPU没有专门用于设备I/O的指令(可以以此判定体系为哪种)。这就是所谓的“I/O内存”方式。即统一编址。
另一类CPU(如X86)将外设的寄存器看成一个独立的地址空间,所以访问内存的指令不能用来访问这些寄存器,而要为对外设寄存器的读/写设置专用指令,如IN和OUT指令。这就是所谓的“I/O端口”方式 。即独立遍址。 CPU是i386架构的情况在i386系列的处理中,内存和外部IO是独立编址,也是独立寻址的。MEM的内存空间是32位可以寻址到4G,IO空间是16位可以寻址到64K。 本文主要聚焦在这类遍址方式上。X86架构下,对应的专用指令 IN, OUT。在C语言中,封装成inp,inpw,inpd, 和outp,outpw,outpd函数。
1.2 I/O内存
随着计算机技术的发展,单纯的“I/O端口”方式无法满足实际需要了,因为这种方式只能对外设中