I/O端口和I/O内存
来源:互联网 发布:卖家怎样设置淘宝客 编辑:程序博客网 时间:2024/04/27 20:59
1. CPU对外设IO端口物理地址的编址方式
(1)I/O映射方式(I/O-mapped),即独立编址
(2)内存映射方式(Memory-mapped),即统一 编址
1.1 独立编址
一些体系结构的CPU(典型地如X86)为外设专门实现了一个单独地地址空间,称为"I/O 地址空间"或者"I/O端口空间"。
这是一个与CPU地RAM物理地址空间不同的地址空间,所有外设的I/O端口均在这一空间中进行编址。CPU通过设立专 门的I/O指令(如X86的IN和OUT指令)来访问这一空间中的地址单元(也即I/O端口)。这就是所谓的"I/O映射方式"(I/O-mapped),也就是“独立编址”。
1.2 统一 编址
有些体系结构的CPU(如,PowerPC、m68k等)通常只实现一个物理地址空间(RAM)。在这种情况下,外设I/O端口的物理地址就被映射到 CPU的单一物理地址空间中,而成为内存的一部分,也就是所谓的“统一编址”,这样,CPU就可以像访问一个内存单元那样访问外设I/O端口(理解为I/O寄存器),而不需要设立专门的外设I/O指令。
这就是所 谓的"内存映射方式"(Memory-mapped)。
1.3 I/O区域
Linux将基于I/O映射方式的或内存映射方式的I/O端口通称为"I/O区域"(I/O region)。
2. I/O外设的访问
2.1 I/O端口
外设都是通过读写设备上的寄存器来进行的,外设寄存器也称为"I/O端口",而IO端口有两种编址方式:独立编址和统一 编制。而具体采用哪一种则取决于CPU的体系结构。
2.2 独立编址和统一编址选择
PowerPC、m68k等采用统一编址,而X86等则采用独立编址。但对于Linux内核而言,它可能用于不同的CPU,所以它必须都要考虑这两种 方式,于是它采用一种新的方法,将基于I/O映射方式的或内存映射方式的I/O端口通称为"I/O区 域"(I/O region)。不论你采用哪种方式,都要先申请IO区域:request_resource(),结束时释放 它:release_resource()。
对于某一既定的系统,它要么是独立编址,要么是统一编制。
2.3 I/O外设访问的方式
对外设的访问分为IO端口访问和IO内存访问。I/O内存包括I/O端口映射到内存的寄存器或设备内存,因为寄存器和内存的差别对软件来说是透明的。
2.3.1 I/O端口访问
I/O端口的访问首先要使用request_region申请I/O资源,然后直接使用intb()/outb()之类的函数来读写IO端口。2.3.2 I/O内存访问
也即"I/O内存"方式,外设寄存器位于"内存空间"(很多外设有自己的内存、缓冲区,外设的寄存器和内存统称"I/O空间")。(为了达到接口的同一性)先把IO端 口映射到IO内存("系统内存空间或I/O内存空间"),再使用访问IO内存的函数来访问IO端口。访问IO内存有2种途径,I/O映射方式(I/O-mapped)、内存映射方式 (Memory-mapped)。访问IO内存的流程是:request_mem_region() ->ioremap() -> ioread8()/iowrite8() -> iounmap() -> release_mem_region()。
还有一种为了最小化I/O端口和内存访问之间的表面区别而使用的汗水:ioport_map()。同使用该函数,能使I/O端口看起来就像I/O内存一样,可以使用I/O内存方式访问I/O端口的所有函数。当不再需要这种映射时,用函数ioport_unmap()来撤销映射。
- 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端口和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内存
- I/O空间-----I/O端口和I/O内存
- I/O端口和I/O内存的访问
- Linux I/O 端口和 I/O 内存
- 访问I/O内存和I/O端口设备
- 如何更改Linux(Ubuntu)语言和编码设置
- http-关于application/x-www-form-urlencoded等字符编码的解释说明
- 【模式识别与机器学习】贝叶斯公式
- MediaPlayer设置StreamType需要在prepare之前
- 我的 PHP 工具类库
- I/O端口和I/O内存
- Android中如何修改系统时间(应用程序获得系统权限)
- 通过MEF来创建具有扩展能力的WCF Creating WCF Service Extensibility through MEF (Managed Extensibility Framework)
- Android Camera 使用小结
- PHPCMS 2008重新生成搜索索引
- eclipse安装CDT插件遇到的问题以及各版本的区别
- 如何打开UltraEdit的文件标签?
- java高级总结1
- 如何搭建Repo服务器端