I/O作为CPU和外设交流的一个渠道,主要分为两种,一种是Port I/O,一种是MMIO(Memory mapping I/O)。 
前者就是我们常说的I/O端口,它实际上的应该被称为I/O地址空间。 
对于x86架构来说,通过IN/OUT指令访问。PC架构一共有65536个8bit的I/O端口,组成64KI/O地址空间,编号从0~0xFFFF。连续两个8bit的端口可以组成一个16bit的端口,连续4个组成一个32bit的端口。I/O地址空间和CPU的物理地址空间是两个不同的概念,例如I/O地址空间为64K,一个32bit的CPU物理地址空间是4G。

MMIO占用CPU的物理地址空间,对它的访问可以使用CPU访问内存的指令进行。一个形象的比喻是把文件用mmap()后,可以像访问内存一样访问文件、同样,MMIO是用访问内存一样的方式访问I/O资源,如设备上的内存。MMIO不能被cache,原因以前很多帖子论述过,就不多说了(有特殊情况,如VGA)。

Port I/O和MMIO的主要区别在于1)前者不占用CPU的物理地址空间,后者占有(这是对x86架构说的,一些架构,如IA64,port I/O占用物理地址空间)。2)前者是顺序访问。也就是说在一条I/O指令完成前,下一条指令不会执行。例如通过Port I/O对设备发起了操作,造成了设备寄存器状态变化,这个变化在下一条指令执行前生效。uncache的MMIO通过uncahce memory的特性保证顺序性。3)使用方式不同

由于port I/O有独立的64KI/O地址空间,但CPU的地址线只有一套,所以必须区分地址属于物理地址空间还是I/O地址空间。早期的CPU有一个M/I针脚来表示当前地址的类型,后来似乎改了。刚才查了一下,叫request command line,没搞懂,觉得还是一个针脚。

IBM PC架构规定了一些固定的I/O端口,ISA设备通常也有固定的I/O端口,这些可以通过ICH(南桥)的规范查到。PCI设备的I/O端口和MMIO基地址通过设备的PCI configure space报告给操作系统,这些内容以前的帖子都很多,可以查阅一下。

通常遇到写死在I/O指令中的I/O端口,如果不是ISA设备,一般都是架构规定死的端口号,可查阅规范。

MMIO与PIO区别相关推荐

  1. 【翻译】QEMU内部机制:顶层概览

    系列文章: [翻译]QEMU内部机制:宏观架构和线程模型 [翻译]QEMU内部机制:vhost的架构 [翻译]QEMU内部机制:顶层概览(本文) [翻译]QEMU内部机制:内存 原文地址:http:/ ...

  2. block中断 virtio_virtio分析

    virtio virtio是一个通用的io虚拟化框架,hypervisor通过他模拟出一系列的虚拟化设备,并使得这些设备在虚拟机内部通过api调用的方式变得可用.它为客户机提供了一个高效访问块设备的方 ...

  3. 一文搞懂CPU如何控制I/O设备

    1 接口和设备:经典适配器模式 输入输出设备不只是一个设备.大部分输入输出设备,都有: 它的接口(Interface) 实际的I/O设备(Actual I/O Device) 硬件设备并非直接接入到总 ...

  4. 浅谈内存映射I/O(MMIO)与端口映射I/O(PMIO)的区别

    最近在看NVMeDirect和SPDK的源码,觉得有必要梳理一下MMIO和PMIO的区别.关于MMIO和PMIO,维基百科上是这么讲滴, Memory-mapped I/O (MMIO) and po ...

  5. PIO模式和DMA模式的区别

    硬盘和内存之间数据传送的两种方式:一是PIO模式,二是DNA模式 PIO模式下通过CPU来控制硬盘和内存之间的数据传输,是一种通过CPU执行I/O端口指令来进行数据的读写的数据交换模式.: DMA模式 ...

  6. ubutntu 使用tftp_TI 816X开发板直接从SD卡读取内核到内存中和通过TFTP下载到内存中区别...

    用的是TI的 816X开发板,现在碰到一个问题,想不明白,请教各位. 我的开发环境是在vmware下安装的ubuntu10.04,通过网线连接到开发板的网口(J10),主机IP为192.168.0.1 ...

  7. [笔记].如何使用Nios II的中断:PIO中断与定时器中断

    引子 定时器中断,我以前在艾米电子论坛发帖讨论过:PIO中断我在博客里也讨论过,最近发现以前的总结有一点小错误.于是结合我最近玩触摸屏的一点点心得,写篇博文. 软硬件环境 硬件:艾米电子EP2C8核心 ...

  8. 【linux开发】IO端口和IO内存的区别及分别使用的函数接口

    IO端口和IO内存的区别及分别使用的函数接口 每个外设都是通过读写其寄存器来控制的.外设寄存器也称为I/O端口,通常包括:控制寄存器.状态寄存器和数据寄存器三大类.根据访问外设寄存器的不同方式,可以把 ...

  9. Nios中PIO的INT

    初涉nios中的INT,开始做的时候中断虽然正常的产生了,但是debug发现初始化木有成功的返回值,main函数中代码: if(!init_KEY1()){printf("interupt ...

  10. 硬盘参数 PIO/DMA/UDMA/SWDMA/MWDMA

    PIO的英文拼写是"Programming Input/Output Model",PIO模式是一种通过CPU执行I/O端口指令来进行数据的读写的数据交换模式.是最早先的硬盘数据传 ...

最新文章

  1. linux下安装wpasupplicant及配置
  2. Spring Boot 2.x基础教程:MyBatis的多数据源配置
  3. 无穷级数求和7个公式_亿图在线公式编辑器使用方法入门篇
  4. SAP物料标准成本估算结果
  5. iphone7wifi模块多少钱_模块炉价格参差不齐,消费者应独具慧眼!
  6. EasyUI中菜单Menu的简单使用
  7. DataTime转Varchar
  8. linux 打包排除多个目录,tar打包整个目录(可排除子目录)几种方法
  9. mui.init方法配置
  10. 联想微型计算机功率,解锁全部潜力,联想这款笔记本可以将CPU功耗提升至24W
  11. 程序员面向软件开发时,如何成功?
  12. mysql会更改原excel吗,上传到mysql时,excel的日期发生变化
  13. 列表页 编辑页 删除页
  14. java 基础 1 final关键字
  15. 伯努利方程(压力与流量的关系)
  16. 计算机双人游戏玩不了,PC上的双人单机游戏
  17. 旋转矩阵是正交矩阵与伴随性质的证明
  18. ubuntu18 防火墙关闭_ubuntu18上关闭默认的防火墙
  19. Integration of image quality and motion cues for face anti-spoofing A neural network approach
  20. Unity XR开发之入门介绍(一)

热门文章

  1. 中文词语自动纠错_编辑距离
  2. LRU算法的一种实现方法
  3. win10开启文件共享服务器,墨涩网 - Windows10开启局域网文件共享功能——墨涩网...
  4. c语言鼠标游戏代码,自己用C写的一个简单的打地鼠游戏代码出了个问题(鼠标和循环不能...
  5. indesign用于产品排班_2019年机器人行业十大新品盘点,过去一年最受关注的产品都在这...
  6. 反射进行.newInstance()方法,报错Caused by: java.lang.NoSuchMethodException:XXXX.<init>()
  7. mysql 30入门_mysql入门(三)
  8. 58java面试题_58到家,java开发实际面试题
  9. npm i 报错 'match' of undefined 错误以及删除node_modules失败
  10. Flutter 35: 图解自定义 View 之 Canvas (二)