1、概念

内存映射I/O(MMIO)【统一编址】和端口映射I/O(PMIO)【独立/单独编址】是两种互为补充的I/O方法,用于设备驱动程序和设备通信,即在CPU和外部设备之间。

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

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

(2)PMIO(IO端口也可以映射到虚拟地址空间进行访问ioport_map)。在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总线。

用户空间想访问IO端口:必须使用ioperm和iopl系统调用(#include ) 来获得进行操作I/O端口的权限。ioperm 为获取单个端口的操作许可,iopl 为获取整个I/O空间许可。这2个函数都是x86特有的。

x86 CPU的I/O空间就只有64KB(0-0xffff)。

Linux内核必须使用“资源”来记录分配给每个硬件设备的I/O端口。资源表示某个实体的一部分,这部分被互斥地分配给设备驱动程序。在这里,资源表示I/O端口地 址的一个范围。每个资源对应的信息存放在resource数据结构中

2、区别

(1)在MMIO中,IO设备和内存共享同一个地址总线,因此它们的地址空间是相同的;而在PMIO中,IO设备和内存的地址空间是隔离的。

(2)在MMIO中,无论是访问内存还是访问IO设备,都使用相同的指令(mov类型的读写内存的指令);而在PMIO中,CPU使用特殊的指令访问IO设备,在Intel微处理器中,使用的指令是IN和OUT。

(3)对MMIO操作是申请-映射-访问-释放(访问流程:request_mem_region() -> ioremap() -> ioread8()/iowrite8() -> iounmap() -> release_mem_region() );PMIO是申请-访问-释放(不映射到内存空间,直接使用 intb()/outb()之类的函数来读写IO端口。

(4)MMIO:CPU需要截获虚拟机访问的具体地址,并发生了异常,从VM-mode下退出来,让qemu继续处理,模拟硬件的行为即可。这就是MMIO下的设备模拟过程,CPU截获MMIO的是misconfig异常;PMIO:CPU只要截获VM(Virtual Machine)的in、out指令,就可以知道CPU想要访问设备,那么用软件来模拟硬件的行为,就可以让VM觉得自己有设备。

(5)MMIO:cat /proc/iomem命令查看外设的IO内存物理地址分布情况;PMIO:cat /proc/ioport,列出了系统所有的IO端口分布情况,注意这边看到的地址不是物理地址,而是IO端口号的分布情况,跟物理地址没有关系,CPU访问外设寄存器就是通过传入这些端口号来访问外设寄存器的。

MMIO和PIO的更多相关文章

  1. KVM基于X86硬件辅助的虚拟化技术实现机制【转】

    内存虚拟化 Shadow Paging 作者 Shawn 在其中文博客中很详尽地介绍了 KVM 在只支持一级分页的 x86 平台上用 “Shadow Paging”进行 MMU 虚拟化的实现,由于目前 ...

  2. Memory-mapped I/O vs port-mapped I/O

    关于MMIO和PIO,我看到的解释最清楚的文章,原文在这里:Memory-mapped I/O vs port-mapped I/O - 2015 Microprocessors normally u ...

  3. java pio项目使用

    一.简介 pio是apache的一个针对microsoft office的一个开源项目. Apache POI - the Java API for Microsoft Documents 官网地址: ...

  4. X86 IO端口和MMIO

    X86 IO端口和MMIO I/O作为CPU和外设交流的一个渠道,主要分为两种,一种是Port I/O,一种是MMIO(Memory mapping I/O).前者就是我们常说的I/O端口,它实际上的 ...

  5. [自制操作系统] 图形界面&VBE工具&MMIO显存&图形库/字库

    本文记录了在JOS(或在任意OS)上实现图形界面的方法与一些图形库的实现. 本文中支持的新特性: 支持基本图形显示 支持中英文显示(中英文点阵字库) 相关:VBE VESA MMIO 点阵字库 Git ...

  6. 从Socket入门到BIO,PIO,NIO,multiplexing,AIO(未完待续)

    Socket入门 最简单的Server端读取Client端内容的demo public class Server { public static void main(String [] args) t ...

  7. PIO学习

    边沿捕获 PIO可以对输入进行边沿捕获,它可以捕获上升沿.下降沿和双沿,当检测到边沿时PIO会把它存在edgecapture 寄存器之内: 打开Synchronously capture 时,会生成一 ...

  8. 硬盘读取速度变慢 — 当前传送模式: PIO模式

    网上搜索了一下,找到两篇文章: 标题:硬盘读取速度变慢 当前传输模式pio的解决方法 http://www.veryhuo.com/a/view/52786.html   (解决思路:先卸载驱动,重启 ...

  9. c语言-遍历pci设备(2)mmio访问

    前言 今天其实我在公司也没有做什么,但是昨天就把pcie遍历的mmio形式做了出来,赞扬公司的台湾服务器,至少我可以使用google来去搜索我想要的资料和答案,有一位大神在台湾的论坛上发布了一片博文, ...

随机推荐

  1. 查找已连接过的wifi密码

    无意之间看到能破解已连接过的wifi密码的诀窍,赶紧存储下来. 1. 首先打开终端 2. 在没有网路的情况下输入: netsh wlan show profiles 结果如下(自己的): 这些‘用户配 ...

  2. python 读取文本文档中的数据

    import os dir = input('Please input the file dir:')#提示输入文件路径 while not os.path.exists(dir):#判断文件是否存在 ...

  3. Codeforces 785 - A/B/C/D/E - (Undone)

    链接:https://codeforces.com/contest/785 A - Anton and Polyhedrons #include<bits/stdc++.h> using ...

  4. ide phpStorm常用代码片段设置

    1.打开设置(File -> Settings) 2.如图 3 . 最后,在PHP文件中输入 ll 并按 TAB 即可打出代码块

  5. mysql ON DUPLICATE KEY UPDATE 与 REPLACE INTO 的区别

    #mysql ON DUPLICATE KEY UPDATE 如果在INSERT语句末尾指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY ...

  6. 遍历其 interator

    当用户自定义数据结构的时候, 如果做遍历呢, 这个时候就需要遍历器 interator 了, 它允许用户定义遍历自己自定义数据结构的方式 当用户定义了iterator, 就可以使用 for of 来遍 ...

  7. flex总结一下

    display:flex:规定元素是flex布局,里面的元素自然会像浮动一样横向排列: flex-direction:row | row-reverse | column | column-rever ...

  8. VUE-004-禁止修改页面显示项,设置el-input,textarea只读方法

    在实际业务需求中,有些内容当初次创建后,即不可再次进行修改变更,因而需要显示的文本内容不允许变更.此时,可通过页面限制防止用户修改. 方法:添加 readonly="true" 或 ...

  9. JMS笔记(三)

    最近重看activemq,对消息的传送确认机制有了进一步认识 1. mq在确认consumer收到消息后才会删除消息,因此consumer接收消息后应该进行ack"确认",java ...

  10. 3.1.4 Spring的事务管理

    四.Spring的事务管理 事务原本是数据库中的概念, 在Dao层. 但一般情况下, 需要将事务提升到 业务层, 即Service层. 这样做是为了 能够使用事务的特性来管理具体的业务. 1. Spr ...