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

最近在看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

 MMIOPMIO
1Same address bus to address memory and I/O devicesDifferent address spaces for memory and I/O devices
2Access to the I/O devices using regular instructionsUses 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/571777.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux sftp密码错误,linux个别用户sftp坏掉,验证密码后卡住, 大概是什么问题?...

问题描述linux个别用户sftp坏掉,验证密码后卡住, 大概是什么问题?所有采用sftp的软件都不能用了winsshfs 点击mount后就卡住xftp 连接验证结束后也卡住sublimeText3 的sftp插件也不好用了突然发生的情况之前一直用着都没有问题一直正常使用 只…

c语言 结构体_C语言 技能提升 系列文章 (三)结构体

今天,来跟大家聊一聊C语言中的结构体。在C语言的各种数据类型中,结构体最特别,因为它是可以被程序员定义的,它的特点是非常的灵活。定义struct defined_name{type_name field_name;};结构体内部的成员可以是任意类型的数据&#x…

基于@FeignClient注解实现两个微服务之间接口的调用(简单)

场景需求:微服务A中的接口input需要调用微服务B中接口的output数据。 实现:使用feign实现即可。 微服务B中的接口: 步骤一:微服务A中编写一个接口,该接口就是调用微服务B的接口;需要在接口上添加FeignClien…

spring boot 自动跳转登录页面_徒手撸一个扫码登录示例工程

徒手撸一个扫码登录示例工程不知道是不是微信的原因,现在出现扫码登录的场景越来越多了,作为一个有追求、有理想新四好码农,当然得紧跟时代的潮流,得徒手撸一个以儆效尤本篇示例工程,主要用到以下技术栈qrcode-plugin&…

inputstreamreader未关闭会导致oom_ThreadLocal 一定会导致内存泄露?

在面试的时候,ThreadLocal作为高并发常用工具经常会被问到。而面试官比较喜欢问的问题有以下两个:1、ThreadLocal是怎么实现来保证每个线程的变量副本的。2、ThreadLocal的内存泄露是怎么产生的,怎么避免内存泄露。首先我们来看第一个问题&am…

keras保存模型_TF2 8.模型保存与加载

举个例子:先训练出一个模型import 接下来第一种方法:只保留模型的参数:这个有2种方法:model.save_weights("adasd.h5")model.load_weights("adasd.h5") model.predict(x_test)model.save_weights(./checkpoin…

第一章 Burp Suite 安装和环境配置

Burp Suite是一个集成化的渗透测试工具,它集合了多种渗透测试组件,使我们自动化地或手工地能更好的完成对web应用的渗透测试和攻击。在渗透测试中,我们使用Burp Suite将使得测试工作变得更加容易和方便,即使在不需要娴熟的技巧的情…

mysql57服务无法启动_将mysqld.service服务加入到systemctl

在开始安装二进制MySQL的时候感觉都还挺好,就是在启动服务的时候比较麻烦,一开始是在Centos6下的感觉也没有什么费劲的;但是在Centos7下面还是有点不太适应,不过还好用用就熟悉了;说明一下,我的安装目录在/usr/local/m…

linux raid autodetect,软raid的建立

1 增加磁盘并分区(修改id)fdisk /dev/sdbCommand (m for help): pDisk /dev/sdb: 8589 MB, 8589934592 bytes255 heads, 63 sectors/track, 1044 cylindersUnits cylinders of 16065 * 512 8225280 bytesDevice Boot Start End Blocks Id System/dev/sd…

c语言for循环的省略写法,C语言两种for循环写法分析

每个C程序员都知道同一个for循环语句可以有两种写法:A: for (i 0; i B: for (i cnt; i > 0; i--){ }前几天,DEBUG的时候, 发现采用A写法的代码反汇编出来有BUG.当时没有时间记录,环境也没有保存下来.今天尝试重现,又没来出现上次的问题...很奇怪.很久很久以前也听说过这两…

python文字游戏 生成数字菜单_pygame游戏之旅 游戏中添加显示文字

本文为大家分享了pygame游戏之旅的第5篇,供大家参考,具体内容如下 在游戏中添加显示文字: 这里自己定义一个crash函数接口: def crash(): message_diaplay(You Crashed) 然后实现接口函数message_display(text) def message_diapl…

springboot netty给特定客户端推送_Spring Boot 又升级了?2.0 你搞懂了吗?!

【小宅按】作为知名互联网公司都在用的技术,Spring Boot 2.0 的更新引起了很大的关注,本文将分为三部分解读 2.0 的更新:第一类,基础环境升级;第二类,默认软件替换和优化;第三类,新技…

OSI七层模型与TCP/IP五层模型详解

博主是搞是个FPGA的,一直没有真正的研究过以太网相关的技术,现在终于能静下心学习一下,希望自己能更深入的掌握这项最基本的通信接口技术。下面就开始搞了。 一、OSI参考模型 今天我们先学习一下以太网最基本也是重要的知识——OSI参考模型。…

android 自定义表情包,android基于环信的聊天和表情自定义

环信sdk的导入自定义聊天界面此处只有静态图,请谅解。自定义表情发送自定义聊天界面简单说下自定义的聊天界面,一个带有recyclerview和的xml文件,和对应的adapter即可。recyclerview为展示聊天信息。通过EMClient.getInstance().chatManager(…

erlang安装_RabbitMQ的使用(一)- RabbitMQ服务安装

作者:markjiang7m2博客园地址:https://www.cnblogs.com/markjiang7m2/p/12769627.html官网地址:http://letyouknow.netRabbitMQ,消息队列的一个中间件,这里不打算展开介绍了。此文意在记录工作中使用RabbitMQ时的过程及…

NodeJS React 开发环境搭建

1、首先需要安装NodeJS环境,下载NodeJS安装程序安装即可。 NodeJS下载地址: https://nodejs.org/en/download/ 2、安装NodeJS的web框架express npm install express-generator -g 3、创建项目 express studyReact 4、添加jsx引擎支持 npm install ex…

dreamweaver 正则表达式为属性值加上双引号_Python正则表达式(一)

Python正则表达式正则表达式是处理字符串的强大工具,拥有独特的语法和独立的处理引擎。我们在大文本中匹配字符串时,有些情况用str自带的函数(比如find, in)可能可以完成,有些情况会稍稍复杂一些(比如说找出所有“像邮箱”的字符串&#xff0…

mapperscan注解_SpringBoot 遗忘后的简单快速回忆之环境搭建与常见注解

原文作者:笑而抿之乎搭建SpringBoot环境,创建maven 项目后1,创建入口类:MapperScan(basePackages "com.baizhi.dao" ) //把dao层交给工厂管理SpringBootApplication//标识入口类的注解public class Applincation { …

Android插件丢失怎么办,Android studio推荐插件以及升级后插件丢失问题解决

1、android-butterknife-zeleznyandroid-butterknife-zelezny 是根据butterknife定制的一款插件,能够方便快速初始化,对于我来说是开发必备,本人也对此插件进行了一些优化,个人感觉用起来更爽 ,博客地址:Bu…

软工团队 - 系统设计

软工团队 - 系统设计 修改完善需求规格说明书 针对栋哥在上周答辩中主要提到问题的相应改动 管理员层面没有在需求中得到很好的体现。没有手机号验证。那时候回答的比较含糊orz,所以在这里说明一下对此作出的解释和修改。 对于第一点,我们讨论的结果是至…