IO端口与IO内存:CPU如何访问设备内存?

文章目录

    • 1. 概要
    • 2. 基本概念
      • 2.1 CPU与内存、设备的交互
      • 2.2 I/O内存
      • 2.3 I/O端口
    • 3. 小结

在这里插入图片描述

1. 概要

本文主要学习下CPU访问设备内存的两种方式。

通常,厂商按照IO空间性质将IO分为如下两种:

  • I/O内存:Memory-Mapped I/O(MMIO);
  • I/O端口:Port I/O(PIO);

2. 基本概念

2.1 CPU与内存、设备的交互

计算机由CPU、内存和外部设备组成

  1. 当CPU要对内存中的内容进行读写操作时,地址总线负责传输地址,控制总线指明是读取操作还是写入操作,数据总线则用来传输写入内存或从内存读出的信息。
  2. CPU与外部设备的交互,则是通过CPU读写外部设备上的寄存器实现的,外设寄存器也称为“I/O端口”。

问题: 内存中的每个存储单元都有一个地址与其对应,CPU根据这个地址就可以指定自己想要访问的存储单元。那么CPU是如何访问外部设备呢?

理论上说,外部设备中的寄存器也需要有一个地址与之相对应,才能让CPU根据寄存器的地址来区分不同设备之间的寄存器和同一个设备中的不同寄存器。既然,外部设备中的寄存器也需要有一个地址,那么现在的问题是外部设备中的寄存器地址与内存地址的关系是什么呢?

2.2 I/O内存

I/O内存:采用统一编址方式。外部设备中的寄存器和内存中的存储单元被同等看待,每个I/O端口占用一个内存存储单元的地址,将内存地址的一部分划出来用作IO地址空间。I/O端口占用了内存的地址空间,使内存的存储量容量减小。

特别地,在一个32位系统中,4G的地址空间被内存和外部设备中的寄存器共同瓜分。

  • 采用统一编址方式,CPU访问外部设备IO端口时,不再需要额外的IN和OUT指令,CPU只需要使用同一套指令就可以访问内存或者IO端口。
  • Arm,powerpc在这一类的嵌入式处理器中采用统一编址方式。

2.3 I/O端口

IO端口:采用独立编址方式。外部设备中的寄存器(I/O端口)地址与内存地址是相互独立、互不影响的,它们分别位于不同的地址空间内。即I/O端口地址位于I/O地址空间内,而内存地址则位于内存地址空间内。

举个例子,I/O地址空间内存在0x01这样的地址,内存地址空间也可以存在0x01这样的地址,它们两个互不影响。那当地址总线上出现0xff这个地址时,CPU到底是想访问内存还是想访问I/O端口呢,这个是由I/O读控制线、I/O写控制线、内存读控制线、内存写控制线来决定的。

  • 如果CPU访问的是I/O端口,那么I/O读控制线或者I/O写控制线被激活;
  • 如果CPU访问的是内存,那么内存读控制线或者内存写控制线被激活。

特别地,32位处理器的内存地址空间大小是4G,而独立编址的I/O地址空间的大小为64K,即它由65536个8bit的I/O端口组成。

所以,采用独立编址方式,对于某个地址(例如0x01)而言,它既可以存在于I/O地址空间内,也可以位于内存地址空间内。在采用独立编址的体系架构下,CPU通过MOV指令来访问内存,而对I/O端口的访问则是通过IN和OUT指令来完成的。


3. 小结

  • I/O内存,就是IO和内存共用一个地址空间;
  • I/O端口,就是IO和内存分别用两个地址空间。

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

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

相关文章

Leetcode刷题之消失的数字(C语言版)

Leetcode刷题之消失的数字(C语言版) 一、题目描述二、题目解析 一、题目描述 数组nums包含从0到n的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗? 注意:本题相对书上原题稍作…

抖音小店无货源爆发期过了吗?现在还能做吗?

大家好,我是电商花花。 抖音小店爆发期过了吗? 我并不觉得,反而抖音小店的流量越来越大了,今年抖音小店日活跃用户已经突破到了9亿,有更大的市场和流量了,且现在做店越来越多了,再加上平台的支…

VNCTF2024 RE yun WP

动态调试血的教训 不过这题比较麻烦,native层没有x86架构,不能用虚拟机跑,得用真机,而且有的真机还装不上,动调贼麻烦。 那就静态分析 jadx可以看到一些简单的字符串判断逻辑 IDA逆一下so文件(注意用7.7打…

高阶流程图(SIPOC)

SIPOC高阶流程图是一种流程映射和改进方法,它使用可视化的方式描述一个或多个流程的输入和输出。SIPOC是五个单词的首字母缩写,分别代表供应商(Suppliers)、输入(Inputs)、过程(Processes&#…

C++初阶:反向迭代器

reverse_iterator的封装实现 Reverse_Iterator.h namespace xx {// 所有容器的反向迭代器// 迭代器适配器template<class Iterator, class Ref, class Ptr>struct Reverse_iterator{Iterator _it;typedef Reverse_iterator<Iterator, Ref, Ptr> Self;Reverse_iter…

更卷的2024,如何把短剧产品做的更好?| TopOn出海干货

2024年3月14日&#xff0c;TopOn 携手快出海、Cloudflare、SensorTower、Google作举办的《娱乐新纪元——探索短剧出海无限机遇》线下研讨交流会圆满落幕。此次会议不仅为短剧出海从业者们提供了一个深入交流的平台&#xff0c;现场嘉宾们的分享更深入探讨了短剧出海的机遇与挑…

负荷预测 | Matlab基于TCN-LSTM-Attention单输入单输出时间序列多步预测

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.负荷预测 | Matlab基于TCN-LSTM-Attention单输入单输出时间序列多步预测&#xff1b; 2.单变量时间序列数据集&#xff0c;采用前12个时刻预测未来96个时刻的数据&#xff1b; 3.excel数据方便替换&#xff0c;运行…

全国贫困县DID数据(2008-2022年)

数据来源&#xff1a;国W院扶贫开发领导小组办公室 时间跨度&#xff1a;2008-2022年 数据范围&#xff1a;各县域 数据指标 年份 县域名称 所属地市 所属省份 县域代码 是否贫困县(是为1&#xff0c;否为0) 参考文献&#xff1a; [1]马雯嘉,吴茂祯.从全面脱贫到乡村振兴…

zookeeper解析

目录 zookeeper定义 zookeeper定义 Zookeeper是一个开源的分布式的&#xff0c;为分布式框架提供协调服务的Apache项目 Zookeeper工作机制 zookeeper从设计模式角度来理解&#xff1a; 是一个基于观察者模式设计的分布式服务管理框架&#xff0c;它负责存储和管理大家都关心…

@Transactional失效的10种场景

Transactional失效的场景都有哪些呢&#xff1f;本章节针对Transactional的问题&#xff0c;做以下总结整理。 1、同一个类中&#xff0c;方法内部调用事务失效 2、事务方法被final、static修饰 3、当前类没有被Spring管理 4、非public修饰的方法&#xff08;存在版本差异&a…

HCIE考试第三题:业务容器化及割接

文章目录 业务容器化及割接题目和做题步骤如下3.1业务容器化及割接3.1创建CCE集群solo3.2创建NAT网关3.2.1申请EIP3.2.2创建NAT网关3.2.3添加SNAT规则3.3创建节点池3.3.1 创建namespace3.3.2创建节点池3.4 安装命令行工具kubectl3.4.1上传kubectl3.4.2上传kubeconfig配置文件3.…

【InternLM 实战营第二期笔记】使用茴香豆搭建你的RAG智能助理

RAG RAG是什么 RAG&#xff08;Retrieval Augmented Generation&#xff09;技术&#xff0c;通过检索与用户输入相关的信息片段&#xff0c;并结合外部知识库来生成更准确、更丰富的回答。解决 LLMs 在处理知识密集型任务时可能遇到的挑战, 如幻觉、知识过时和缺乏透明、可追…