最近在看NVMeDirect和SPDK的源码,觉得有必要梳理一下MMIO和PMIO的区别。关于MMIO和PMIO,维基百科上是这么讲滴,

Memory-mapped I/O (MMIO) and port-mapped I/O (PMIO) (which is also called
isolated I/O) are two complementary methods of performing input/output (I/O)
between the central processing unit (CPU) and peripheral devices in a computer.
An alternative approach is using dedicated I/O processors, commonly known as
channels on mainframe computers, which execute their own instructions.

在计算机中,内存映射I/O(MMIO)和端口映射I/O(PMIO)是两种互为补充的I/O方法,在CPU和外部设备之间。另一种方法是使用专用的I/O处理器,通常为大型机上的通道,它们执行自己特有的指令。

1. MMIO

Memory-mapped I/O (MMIO), 内存映射IO。 先上图,图片来源戳这里

从上图中我们可以看到,在MMIO中,内存和I/O设备共享同一个地址空间。 MMIO是应用得最为广泛的一种IO方法,它使用相同的地址总线来处理内存和I/O设备,I/O设备的内存和寄存器被映射到与之相关联的地址。当CPU访问某个内存地址时,它可能是物理内存,也可以是某个I/O设备的内存。因此,用于访问内存的CPU指令也可来访问I/O设备。每个I/O设备监视CPU的地址总线,一旦CPU访问分配给它的地址,它就做出响应,将数据总线连接到需要访问的设备硬件寄存器。为了容纳I/O设备,CPU必须预留给I/O一个地址区域,该地址区域不能给物理内存使用。

2. PMIO

Port-mapped I/O (PMIO),端口映射IO,又叫做被隔离的I/O(isolated I/O)。还是先上图,图片来源戳这里

从上图中我们可以看到,在PMIO中,内存和I/O设备有各自的地址空间。 端口映射I/O通常使用一种特殊的CPU指令,专门执行I/O操作。在Intel的微处理器中,使用的指令是IN和OUT。这些指令可以读/写1,2,4个字节(例如:outb, outw, outl)从/到IO设备上。I/O设备有一个与内存不同的地址空间,为了实现地址空间的隔离,要么在CPU物理接口上增加一个I/O引脚,要么增加一条专用的I/O总线。由于I/O地址空间与内存地址空间是隔离的,所以有时将PMIO称为被隔离的IO(Isolated I/O)。

3. MMIO v.s. PMIO

  MMIO PMIO
1 Same address bus to address memory and I/O devices Different address spaces for memory and I/O devices
2 Access to the I/O devices using regular instructions Uses a special class of CPU instructions to access I/O devices, Intel x86 microprocessors - IN and OUT instructions
  • 在MMIO中,IO设备和内存共享同一个地址总线,因此它们的地址空间是相同的; 而在PMIO中,IO设备和内存的地址空间是隔离的。
  • 在MMIO中,无论是访问内存还是访问IO设备,都使用相同的指令; 而在PMIO中,CPU使用特殊的指令访问IO设备,在Intel微处理器中,使用的指令是IN和OUT。

注意: 内存映射(MMIO和PMIO)作为一种CPU对I/O设备(CPU-to-device)的通信方法,并不影响DMA(直接内存访问), 因为DMA是一种绕过CPU的内存对设备(memory-to-device)的通信方法。

4. 如何实现MMIO?

在Linux中, 内核使用ioremap()将IO设备的物理内存地址映射到内核空间的虚拟地址上; 用户空间程序使用mmap(2)系统调用将IO设备的物理内存地址映射到用户空间的虚拟内存地址上,一旦映射完成,用户空间的一段内存就与IO设备的内存关联起来,当用户访问用户空间的这段内存地址范围时,实际上会转化为对IO设备的访问。

参考资料

  • Memory-mapped I/O
  • Programmed I/O: isolated vs. memory-mapped
  • Memory-mapped I/O
  • What is the difference between an I/O mapped I/O, and a memory mapped I/O in the interfacing of the microprocessor?
  • Difference between port mapped and memory mapped access?

转载于:https://www.cnblogs.com/idorax/p/7691334.html

浅谈内存映射I/O(MMIO)与端口映射I/O(PMIO)的区别相关推荐

  1. Linux内核之浅谈内存寻址

    Linux内核之浅谈内存寻址 前言 最近在看内存寻址的内容,略有所得,发此文与大家一起交流.我们知道计算机是由硬件和软件组成,硬件主要包括运算器.控制器.存储器.输入设备和输出设备,软件主要是操作系统 ...

  2. 多线程之旅之四——浅谈内存模型和用户态同步机制

     用户态下有两种同步结构的 volatile construct: 在简单数据类型上原子性的读或者写操作   interlocked construct:在简单数据类型上原子性的读和写操作 (在这里还 ...

  3. 浅谈JQuery中$('.classname').get(0); $('.classname').eq(0); $('.classname')[0]三者的区别

    举例浅谈JQuery中$('.classname').get(0); $('.classname').eq(0); $('.classname')[0]三者的区别 demo Dom结构: <di ...

  4. java e.getmessage() null,浅谈Java异常的Exception e中的egetMessage()和toString()方法的区别...

    Exception e中e的getMessage()和toString()方法的区别: 示例代码1: public class TestInfo { private static String str ...

  5. iptables实现端口映射(本地和远程端口映射)

    iptables实现端口映射(本地和远程端口映射) 说明: 需要将外网访问本地IP(192.168.75.5)的80端口转换为访问192.168.75.3的8000端口,这就需要用到iptables的 ...

  6. 【JD资讯】什么是端口映射?路由器如何设置端口映射?

    [JD资讯]什么是端口映射?路由器如何设置端口映射? 不少朋友问到什么是端口端射?在项目中我们经常会遇到,这个功能也是非常实用的,可以解决一些远程控制访问,很多朋友对这个设置一直都了解不多.那么如何设 ...

  7. linux修改容器内的mysql端口映射_修改docker容器端口映射的方法

    大家都知道docker run可以指定端口映射,但是容器一旦生成,就没有一个命令可以直接修改.通常间接的办法是,保存镜像,再创建一个新的容器,在创建时指定新的端口映射. 有没有办法不保存镜像而直接修改 ...

  8. 端口映射工具linux,Linux下端口映射工具rinetd(示例代码)

    Linux下简单好用的工具rinetd,实现端口映射/转发/重定向 官网地址http://www.boutell.com/rinetd 软件下载 wget http://www.boutell.com ...

  9. linux上容器端口映射,MacOS下的docker端口映射

    本人是macos,不能提供docker的运行环境,所以需要用boot2docker,问题就出在这,因为boot2docker其实是使用VBOX虚拟机的,所以实际上外部如果想要访问到容器的话,需要两层层 ...

最新文章

  1. 浮点数在计算机中的表示
  2. centos 安装 svn
  3. CSS HACK:IE6、IE7、IE8、Firefox兼容性问题解决方案
  4. JMeter 分布式性能测试
  5. SAP获利能力报表常用Tcode的区别
  6. 如何在10亿个整数中找出前1000个最大的数(TopN算法)
  7. 本地java【动态监听】zk集群节点变化
  8. rpm mysql 更改目录_rpm形式安装的MySQL服务 并 修改数据文件目录( red hat)_mysql...
  9. 基于FPGA实现压缩算法
  10. JQuery操作类数组的工具方法
  11. PHP常量详解:define和const的区别
  12. Xgboost版本对比(原生版与sklearn接口版)
  13. 【验证码识别】基于matlab GUI遗传算法和最大熵优化+大津法(OTSU)+自定义阈值数字验证码识别【含Matlab源码 1694期】
  14. Android-蓝牙AVRCP功能实现【转】
  15. 算数平均法和加权平均法
  16. 裁剪用C语言,多边形裁剪
  17. 3060ti配什么cpu和主板
  18. 面试官:软件测试没搞懂这些,哪里来的自信投简历? 刁钻问得高频的面试题(含答案)
  19. 《那些年啊,那些事——一个程序员的奋斗史》——02
  20. 【Matlab笔记】测绘工程专业正算、反算、度分秒转弧度函数

热门文章

  1. c语言如何输入矩阵_如何在 COMSOL 软件中调试外部材料
  2. 卷积神经网络的整体结构、卷积层、池化、python实现
  3. 选择排序--Java
  4. linux 内核入口地址,linux内核的加载地址和入口地址
  5. C/C++ 文件的后缀名
  6. android 媒体库扫描,如何扫描出Android系统媒体库中视频文件
  7. python基础入门(8)之集合
  8. 【课题总结】OpenCV 抠图项目实战(3)抠图综述
  9. 【OpenCV 例程200篇】10. 图像的拼接(np.hstack)
  10. arcgis显示后台错误_死亡、税收和Esri ArcGIS 999999错误:如何修复