欢迎来到天天文库
浏览记录
ID:40748252
大小:134.84 KB
页数:6页
时间:2019-08-07
《I_O空间通俗易懂》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、I/O空间-----I/O端口和I/O内存 首先上图,如下:外设中的寄存器被称为I/O端口,外设中的内存被称为I/O内存。二者合起来统称为I/O空间。 设备驱动程序要直接访问外设或其接口卡上的物理电路,这部分通常都是以寄存器的形式出现。外设寄存器称为I/O端口,通常包括:控制寄存器、状态寄存器和数据寄存器三大类。根据访问外设寄存器的不同方式,可以把CPU分成两大类。 一类CPU(如M68K,PowerPC,ARM,Unicore等)把这些寄存器看作内存的一部分,寄存器参与内存统一编址,访问寄存器就通过访问一般的内存指
2、令进行,所以,这种CPU没有专门用于设备I/O的指令(可以以此判定体系为哪种)。这就是所谓的“I/O内存”方式。 另一类CPU(如X86)将外设的寄存器看成一个独立的地址空间,所以访问内存的指令不能用来访问这些寄存器,而要为对外设寄存器的读/写设置专用指令,如IN和OUT指令。这就是所谓的”I/O端口”方式。但是,用于I/O指令的“地址空间”相对来说是很小的。事实上,现在x86的I/O地址空间已经非常拥挤。 但是,随着计算机技术的发展,单纯的”I/O端口"方式无法满足实际需要了,因为这种方式只能对外设中的几个寄存器进行操作。而实际上,需求在不断发生变化,例如,在PC上可以插上一块图形
3、卡,有2MB的存储空间(设备内存),甚至可能还带有ROM,其中装有可执行代码。自从PCI总线出现后,不管CPU的设计采用I/O端口方式还是I/O内存方式,都必须将外设卡上的存储器映射到内存空间,实际上是采用了虚存空间的手段,这样的映射是通过ioremap()来建立的。 1.CPU是i386架构的情况在i386系列的处理中,内存和外部IO是独立编址,也是独立寻址的。MEM的内存空间是32位可以寻址到4G,IO空间是16位可以寻址到64K。 2.在Linux内核中,访问外设上的IOPort必须通过IOPort的寻址方式。而访问IOMem就比较罗嗦,外部MEM不能和主存一样访问,虽然大小上
4、不相上下,可是外部MEM是没有在系统中注册的。访问外部IOMEM必须通过remap映射到内核的MEM空间后才能访问。为了达到接口的同一性,内核提供了IOPort到IOMem的映射函数。映射后IOPort就可以看作是IOMem,按照IOMem的访问方式即可。 3.CPU是ARM或PPC或Unicore架构的情况: 在这一类的嵌入式处理器中,IOPort的寻址方式是采用内存映射,也就是IObus就是Membus。系统的寻址能力如果是32位,IOPort+Mem(包括IOMem)可以达到4G。 访问这类IOPort时,我们也可以用IOPort专用寻址方式。至于在对IOPort寻址时,内核
5、是具体如何完成的,这个在内核移植时就已经完成。在这种架构的处理器中,仍然保持对IOPort的支持,完全是i386架构遗留下来的问题,在此不多讨论。而访问IOMem的方式和i386一致。 RISC指令系统的CPU(如ARM、PowerPC等)通常只实现一个物理地址空间,外设I/O端口成为内存的一部分。此时,CPU可以象访问一个内存单元那样访问外设I/O端口,而不需要设立专门的外设I/O指令。 I/O端口编址方式 先有个概念,I/O端口是CPU对外部设备的抽象。对一个CPU来说,所有它所管理(或访问)的资源无非包括: 1.寄存器组。粗糙的划分通常包括通用寄存器组(x86中
6、就是你用的ex,bx等寄存器),特殊寄存器组(如标志寄存器,timer,interrupt等,当然这些设备你可以看作外部设备)。 2.存储器。粗糙的划分通常包括程序存储器,数据存储器。 3.外部设备。比如打印机,PCI桥,USB等等。另外上面timer,interrupt等等有时也按外部设备处理。 把这些资源统统放在一个大的集合中,就构成了CPU所管理的资源集。CPU管理这些资源时需要为这个集合中每个元素分配一个标志来区分。这个标志就是地址。 编码地址由下面几个要素组成: 地址={资源类别,资源大小}; 对CPU指令来说,通常资源类别编码在指令码中(如i独立编址),也有编码在地址
7、码中(如统一编址),还有直接硬件区分(如哈佛结构的程序存储器与数据存储器分开)。比如x86的in,inp,outp指令,实际上指令码本身就编码有资源类别信息。资源大小编码在地址码中。 按照上面的模型,那么CPU所有资源都可以以地址:{资源类别,资源大小}来找到。 这里I/O端口就对应实际的物理设备,而I/O空间地址就是该物理设备对应的标志码及设备地址。可以这样说,I/OSpace代表所有I/O设备集合,而I/O端口是该集合中的一
此文档下载收益归作者所有