几乎每一种外设都是通过读写设备上的寄存器来进行的。外设寄存器也称为“I/O端口”,通常包括:控制寄存器、状态寄存器和数据寄存器三大类,而且一个外设的寄存器通常被连续地编址。CPU对外设IO端口物理地址的编址方式有两种:一种是I/O映射方式(I/O-mapped),另一种是内存映射方式(Memory-mapped)。而具体采用哪一种则取决于CPU的体系结构。

有些体系结构的CPU(如,PowerPC、m68k等)通常只实现一个物理地址空间(RAM)。在这种情况下,外设I/O端口的物理地址就被映射到CPU的单一物理地址空间中,而成为内存的一部分。此时,CPU可以象访问一个内存单元那样访问外设I/O端口,而不需要设立专门的外设I/O指令。这就是所谓的“内存映射方式”(Memory-mapped)。

而另外一些体系结构的CPU(典型地如X86)则为外设专门实现了一个单独地地址空间,称为“I/O地址空间”或者“I/O端口空间”。这是一个与CPU地RAM物理地址空间不同的地址空间,所有外设的I/O端口均在这一空间中进行编址。CPU通过设立专门的I/O指令(如X86的IN和OUT指令)来访问这一空间中的地址单元(也即I/O端口)。这就是所谓的“I/O映射方式”(I/O-mapped)。与RAM物理地址空间相比,I/O地址空间通常都比较小,如x86CPU的I/O空间就只有64KB(0-0xffff)。这是“I/O映射方式”的一个主要缺点。
===========================================
以上描述中“外设I/O端口的物理地址就被映射到CPU的单一物理地址空间中,而成为内存的一部分”应该如何理解?
这个I/O端口被映射到内存后,是在内存中有一个I/O端口的“镜像”吗(就是说I/O本身的寄存器地址和映射到内存后的端口地址是分开的,只是关系上存在一个对应而已)?还是说I/O端口本身和物理内存一起被编码为连续的“CPU识别的地址”(即CPU将物理内存编码后接着将I/O地址也跟着编码,内存地址和I/O地址并不存在一个对应关系,只是逻辑上被编码为一个连续统一的“物理地址”。)
以上两种理解哪种才是正确的?
另外我想问一下这个“CPU的单一物理地址空间”包括哪些对象,仅仅是物理Memory(RAM\ROM\FLASH)对象吗?是不是一个逻辑上的概念?

回答:外设I/O端口的物理地址就被映射到CPU的单一物理地址空间中,而成为内存的一部分

就是说端口可以用访问内存的方式操纵,比如mov指令,可以把数据直接传送到那个端口

I/O端口本身和物理内存一起被编码为连续的“CPU识别的地址”(即CPU将物理内存编码后接着将I/O地址也跟着编码,内存地址和I/O地址并不存在一个对应关系,只是逻辑上被编码为一个连续统一的“物理地址”。)
这个解释差不多吧

I/O映射和内存映射相关推荐

  1. linux 文件IO与内存映射:内存映射

    前言 前面几篇我们学习了用户空间的IO缓冲区,以及IO缓冲区的分散聚合IO技术. 为了减少系统调用的次数,提升系统性能,操作系统开发者门提出了这么多的缓存技术. 但是到这里这些技术同样有不足的地方:不 ...

  2. 实验3 linux内存映射,3Linux内存映射,mmap()函数

     1mmap()依赖的头文件 #include 2函数声明: void *mmap(void *addr, size_t length, intprot, int flags, intfd, of ...

  3. c语言 内存映射文件,内存映射文件

    内存映射文件 03/30/2017 本文内容 内存映射文件包含虚拟内存中文件的内容. 借助文件和内存空间之间的这种映射,应用(包括多个进程)可以直接对内存执行读取和写入操作,从而修改文件. 可以使用托 ...

  4. IO的端口映射和内存映射 (Port mapped I/O 和 Memory mapped I/O说明)

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

  5. Linux 内存映射mmap,内存映射mmap

    Table of Contents 1. 什么是mmap 2. 使用方法 2.1. mmap构造器的格式 2.2. 例子1 2.3. 例子2 3. 其它 4. 参考资料 什么是mmap 通常在Unix ...

  6. MongoDB内存映射文件

    2019独角兽企业重金招聘Python工程师标准>>> Mongodb源码分析--内存文件映射(MMAP) 内存映射文件原理探索 Linux 内存映射函数 mmap()函数详解 Li ...

  7. windows笔记-内存映射文件

    Windows提供了3种进行内存管理的方法: • 虚拟内存,最适合用来管理大型对象或结构数组. • 内存映射文件,最适合用来管理大型数据流(通常来自文件)以及在单个计算机上运行的多个进程之间共享数据. ...

  8. Linux内存管理之高端内存映射

    一:引子 我们在前面分析过,在linux内存管理中,内核使用3G->4G的地址空间,总共1G的大小.而且有一部份用来做非连续空间的物理映射(vmalloc).除掉这部份空间之外,只留下896M大 ...

  9. mongodb内存映射原理

    内存映射 mongodb非常吃内存,为啥这么吃内存呢,mongodb使用的是内存映射存储引擎,即Memory Mapped Storage Engine,简称MMAP,MMAP可以把磁盘文件的一部分或 ...

最新文章

  1. 【C++】C++11 STL算法(五):设置操作(Set operations)、堆操作(Heap operations)
  2. 使用Docker部署Node.js中的Vue项目
  3. [POJ2976] Dropping tests
  4. linux la 的使用方法,Linux简介及常用命令使用4--linux高级命令与技巧(示例代码)
  5. java runtime类 heap_Java 进阶(一) JVM运行时内存模型
  6. Iterator(迭代器)遍历Collection集合元素
  7. 打破凉凉诅咒:三个有大量用户基础的区块链项目
  8. 了解 sourceMap 配置
  9. 终于把视频控件写出来了
  10. Python学习笔记之 循环,列表生成式,生成器,迭代器
  11. 程序员的电脑文件管理技巧
  12. 做python少儿编程教程-基于海龟编辑器python少儿编程
  13. (1) racecar零件购买
  14. Uber天使投资人杰森卡拉卡尼斯投资…
  15. 电脑插入耳机后没反应怎么办?
  16. 一个C#版的多选题选项及判分设计方案
  17. 东塔靶场之文件上传cms--pluck
  18. android 电池检测软件,电池寿命检测软件下载-电池寿命检测 安卓版v2.7.0-PC6安卓网...
  19. linux debian教程,Debian安装全攻略
  20. 一步步学习zynq软硬件协同开发(AX7010/20)【FPGA+ReWorks】:创建自定义IP实现rtc读写

热门文章

  1. ADA4530静电计放大器
  2. python 多线程 多进程 zmq_研二硕, Python +pyqt,多进程问题求助
  3. Linux启动跟windows启动,Windows,Linux启动机制简介
  4. 列举5个python内置函数_Python5个内建高阶函数的使用
  5. mysql数据库什么是事件_MySQL数据库之mysql 事件(Event) 总结
  6. matlab 实现分行读取
  7. 【 MATLAB 】模拟信号采样及离散时间傅里叶变换(DTFT)案例分析
  8. 序列信号产生器的verilog HDL 设计
  9. 工作流程怎么安排?用Edraw Max轻松创建工作流程图!
  10. HttpPrinter与YunPrinter区别