一文搞懂CPU如何控制I/O设备

news2025/1/20 3:38:20

1 接口和设备:经典适配器模式

输入输出设备不只是一个设备。大部分输入输出设备,都有:

  • 它的接口(Interface)
  • 实际的I/O设备(Actual I/O Device)

硬件设备并非直接接入到总线上和CPU通信,而是通过接口,用接口连接到总线,再通过总线和CPU通信。
SATA硬盘,绿色电路板和黄色齿状部分就是接口电路,黄色齿状的就是和主板对接的接口,绿色的电路板就是控制电路。

并行接口(Parallel Interface)、串行接口(Serial Interface)、USB接口都是计算机主板上内置的各接口。实际硬件设备,如使用并口的打印机、使用串口的鼠标或使用USB接口的U盘,都要插入这些接口,才能和CPU工作及通信。

接口本就是块电路板。CPU不和实际硬件设备打交道,而是和这接口电路板交互。设备里有三类寄存器,都在这设备的接口电路,而不在实际设备:

  • 状态寄存器(Status Register)
  • 命令寄存器(Command Register)
  • 数据寄存器(Data Register)

除了内置在主板上的接口之外,有些接口可集成在设备上。90年代用都是IDE硬盘,集成设备电路(Integrated Device Electronics)。设备的接口电路直接在设备上,而不在主板。要通过一个线缆,把集成了接口的设备连接到主板上去。

PC的设备管理器:

把接口和实际设备分离,来自于计算机走向开放架构(Open Architecture)的时代。

  • 当对计算机升级,不会扔旧计算机,直接买全新计算机,而是可单独升级硬盘。把老硬盘从接口上拿走,换个新的上去
  • 各种输入输出设备的制造商,也可根据接口的控制协议,来设计和制造硬盘、鼠标、键盘、打印机乃至其他种种外设

OOP里的面向接口编程的接口,就是Interface。Adaptor设计模式更是常见用来解决不同外部应用和系统“适配”问题的方案。

设备管理器里有各种Devices(设备)、Controllers(控制器)、Adaptors(适配器)。都是对于输入输出设备不同角度的描述:

  • Devices,看重实际的I/O设备本身
  • Controllers,看重输入输出设备接口里面的控制电路
  • Adaptors,看重接口作为一个适配器后面可以插上不同的实际设备

2 CPU如何控制I/O设备

无论内置在主板上的接口or集成在设备上的接口,除三类寄存器,还有对应控制电路。正是控制电路,CPU才能通过向这个接口电路板传输信号,控制实际硬件。

硬件设备的这些寄存器有啥用?

打印机案例

  • 数据寄存器(Data Register)
    CPU向I/O设备写入需要传输的数据,比如要打印“Time”,就要先发送一个“T”到对应I/O设备。

  • 命令寄存器(Command Register)
    CPU发送一个命令,告诉打印机,要进行打印。这时,打印机里的控制电路会:

  • 设置状态寄存器里面的状态,把状态设置成not-ready

  • 实际操作打印机进行打印

  • 状态寄存器(Status Register)
    告诉CPU,现在设备已经在工作了,这时,CPU你再发送数据或者命令过来,都是没有用的。直到前面的动作已经完成,状态寄存器重新变成了ready状态,我们的CPU才能发送下一个字符和命令。

打印机里通常不只有数据寄存器,还有数据缓冲区。CPU也不是真的一个字符一个字符交给打印机去打印,而是一次性把整个文档传输到打印机的内存或数据缓冲区里一起打印。

3 信号和地址:发挥总线的价值

CPU往总线发啥命令,才能和I/O接口上的设备通信?

CPU和I/O设备的通信也是通过CPU支持的机器指令执行的。

MIPS的机器指令的分类并没有一种专门的和I/O设备通信的指令类型。那MIPS CPU是通过什么样的指令来和I/O设备通信?
和访问主内存一样,使用“内存地址”。为让CPU尽可能简单,计算机把I/O设备的各寄存器及I/O设备内部的内存地址,都映射到主内存地址空间。
主内存地址空间里,会给不同I/O设备预留一段段内存地址。CPU想要和这些I/O设备通信,就往这些地址发数据:

  • 这些地址信息,就是地址线发送的
  • 对应的数据信息通过数据线发送

I/O设备会监控地址线,并在CPU往自己地址发数据时,把对应数据线里传输过来的数据,接入到对应的设备里的寄存器和内存。
CPU无论是向I/O设备发命令、查询状态还是传输数据,都可这样。这种方式叫内存映射IO(Memory-Mapped I/O,简称MMIO)。

MMIO是唯一的一种CPU和设备通信的方式吗?
No!MIPS CPU很简单,所以这里只有MMIO。而有2000多个指令的Intel X86计算机,自然可以设计专门的和I/O设备通信的指令:in、out 指令。

Intel CPU虽支持MMIO,不过还可以通过特定指令支持:

  • 端口映射I/O(Port-Mapped I/O,简称PMIO)
  • 或独立输入输出(Isolated I/O)

PMIO的通信方式和MMIO差不多,区别在于PMIO里访问的设备地址,不再是在内存地址空间里,而是一个专门的端口(Port)。

该端口并非一个硬件上的插口,而是和CPU通信的一个抽象概念

PMIO、MMIO,CPU都会传送一条二进制数据,给到I/O设备的对应地址。
设备自己本身的接口电路,再去解码这个数据。解码后的数据变成设备支持的一条指令,再通过控制电路去操作实际的硬件设备。
对CPU,它并不需关心设备本身能够支持哪些操作。它要做的,只是在总线上传输一条条数据就好了。

这就像Command设计模式,在总线上传输的,是一个个数据对象,然后各接受这些对象的设备,再根据对象内容,进行实际解码和命令执行。

设备管理器里显卡设备的资源信息:

设备管理器里面的资源(Resource)信息。里面既有Memory Range,这个就是设备对应映射到的内存地址,也就是我们上面所说的MMIO的访问方式。还有I/O Range,即PMIO,通过端口来访问I/O设备的地址。
IRQ,会来自于这个设备的中断信号。

4 总结

CPU并非发送一个特定操作指令来操作不同I/O设备。若那样,新I/O设备发明,就要去扩展CPU指令集。

CPU和I/O设备之间的通信是这么解决:

首先,在I/O设备这一侧,我们把I/O设备拆分成,能和CPU通信的接口电路,以及实际的I/O设备本身。接口电路里面有对应的状态寄存器、命令寄存器、数据寄存器、数据缓冲区和设备内存等等。接口电路通过总线和CPU通信,接收来自CPU的指令和数据。而接口电路中的控制电路,再解码接收到的指令,实际去操作对应的硬件设备。

CPU侧,对CPU,它看到的并非一个个特定设备,而是一个个内存地址或端口地址。CPU只是向这些地址传输数据或读取数据。所需要的指令和操作内存地址的指令无本质差别。通过软件层对传输的命令数据的定义实际操作对应的I/O硬件。

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

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

相关文章

UOS 录制电脑播放的音频 / 内录音频

Windows 里面有一个“立体声混音”,可以内录电脑播放的音频,而不受到外界噪音的干扰。前段时间接到反馈说 UOS 的设置里面的音频输入里面没有可以选择的设备,这里就稍微探索了一下,发现 UOS 也是可以配置内录的。这里参考了一下这…

网络基础(一)

网络基础(一)计算机网络背景网络发展独立模式: (计算机之间相互独立)网络互联: ( 多台计算机连接在一起, 完成数据共享)局域网LAN: (计算机数量更多了, 通过交换机和路由器连接在一起);广域网WAN: (将远隔千里的计算机…

vue入门到精通(一)

一、vue简介 Vue是一款用于构建用户界面的 JavaScript 框架。 它基于标准 HTML、CSS 和 JavaScript 构建,并提供了一套声明式的、组件化的编程模型,帮助你高效地开发用户界面。 无论是简单还是复杂的界面,Vue 都可以胜任。 二、vue3选项式…

Linux编译器-gcc/g++使用

目录 1. 背景知识 2. gcc如何完成 2.1 预处理(进行宏替换) 2.2 编译(生成汇编) 2.3 汇编(生成机器可识别代码) 2.4 链接(生成可执行文件或库文件) 3 函数库 3.1 分类 3.2 图解 4 gcc选项 1. 背景知…

开源工具系列2:Trivy

在云原生安全的场景中,一个常见的场景就是对漏洞和配置进行扫描,以发现整个 K8s 环境的安全问题。今天我们来介绍一个高效的扫描工具Trivy。 Trivy 是什么 Trivy(tri 发音为 trigger,vy 发音为 envy)是一个简单而全面…

QT 学习笔记(十七)

文章目录一、多线程简介1. 基础知识2. 多线程的优缺点及注意事项二、多线程详解1. 背景案例2. 通过多线程对背景案例进行优化3. 方法一:多线程的创建使用(QT 4.7 以前)3.1 方法一的创建步骤3.2 方法一的具体实现及实现代码4. 方法二&#xff…

Android Hook之Frida安装使用

目录Frida安装安装frida-serverfrida-server配置和启动Frida Hook实例1:实例2:Frida 常用命令Frida 是一个动态检测框架,允许开发人员在 Windows、macOS、Linux、iOS 和 Android 上的原生应用程序中注入 JavaScript 或 Python 脚本。该框架可…

Spring复习(二)

FactoryBean FactoryBean是一个接口,需要创建一个类实现该接口 package com.mao.pojo;import org.springframework.beans.factory.FactoryBean;public class StudentFactoryBean implements FactoryBean {//getObject方法将对象交给Spring容器来管理Overridepubli…

Go web开发

使用 Gin-Plus 框架快速进行 web 开发 一、前言 安装 Get go get github.com/archine/gin-plus/v2v2.0.0Mod # go.mod文件加入下面的一条 github.com/archine/gin-plus/v2 v2.0.0# 命令行在该项目目录下执行 go mod tidy二、项目使用 1、启动入口 定义 main 文件&#xf…

来自一位双非本科大二学生的?自我救赎:堕落——蜕变

回望2022:获得?:失去;开心?:难过;伤心?:释怀 先提一句,总结2022,有后悔、不甘;有开心、感动;2022结束,更多的是…

springboot 2.6.6读不到nacos上的配置文件

搭建了一个微服务项目 spring boot 版本:2.6.6 spring cloud 版本:2021.0.1 spring cloud alibaba 版本:2021.0.1.0 遇到的问题无论是在application.yml还是在bootstrap.properties属性文件里配置服务中心相关的的信息都不能读取nacos上的…

LeetCode[215]数组中的第K个最大元素

难度:中等题目:给定整数数组 nums和整数 k,请返回数组中第 k个最大的元素。请注意,你需要找的是数组排序后的第 k个最大的元素,而不是第 k个不同的元素。你必须设计并实现时间复杂度为 O(n)的算法解决此问题。示例 1:输…

2.5(完结)C语言重点解剖内存管理函数要点速记

1.指针如果有具体的指向,包括野指针,对应的合法性,我们是无法验证的。 2.所有的指针如果没有被直接使用,必须设置为NULL。 3.在函数内部,要验证指针的合法性,本质上是验证指针!NULL。 4.自定义函数传入指…

Odoo 16 企业版手册 - 库存管理之到岸成本

到岸成本 到岸成本可以定义为买方在购买时应支付的产品总价。这包括运输、关税、手续费、服务费、运费等。为了获得产品的销售价格,这些额外费用被添加到产品的实际成本中。根据公司政策,不同公司的到岸成本计算方法将有所不同。在Odoo 库存模块中&#…

JAVA中的for循环使用方法

一. 循环结构1. 概念在学习Java里的循环之前,我们先来了解一下到底什么是循环,以及循环的作用。我们先来看下面这张图:大家想一下,我们在400米的跑道上参加万米长跑,正常情况下要跑25圈,这25圈每一圈的跑步…

FPGA:逻辑运算及逻辑门

文章目录逻辑变量与逻辑函数逻辑运算基本逻辑运算及对应的逻辑门1.与运算与逻辑举例状态表与真值表与逻辑符号与逻辑表达式与门电路2. 或运算或逻辑举例电路状态表状态表与真值表或逻辑符号或逻辑表达式或门电路3. 非运算非逻辑举例电路状态表状态表与真…

Lichee_RV学习系列---认识Lichee Rv Dock、环境搭建和编译第一个程序

Lichee Rv Dock学习系列文章目录 文章目录Lichee Rv Dock学习系列文章目录前言一、认识Lichee RV1、D1-H 芯片2、Lichee RV开发板3、系统镜像二、Lichee RV 固件烧录1、要求基本硬件2、基本资料下载3、固件烧录在这里插入图片描述三、连接上开发板1、ADB方式连接a:A…

【ART-Pi学习FreeRTOS】使用STM32CubeIDE搭建开发环境

【ART-Pi】使用STM32CubeIDE搭建开发环境STM32CubeIDESTM32CubeIDE新建工程进入芯片选型界面HSE和LSE时钟源设置时钟系统(时钟树)配置Generate CodeSTM32CubeIDE STM32CubeIDE安装比较简单,这里略过,可以百度搜索相关教程 STM32…

Excel 中选择行的快捷方式有哪些

在处理不同类型的数据时,用户需要多次选择任意行或多行。在这种情况下,任何人都必须知道选择行的快捷方式。了解一些快捷键,如在Excel中选择行,使任何人都能熟练使用MS Excel,而且这对任何人以更智能的方式工作都很有帮助。当一个人开始使用快捷方式执行他的/她的工作时,…

Spring与SpringMVC的区别和联系是啥?

Spring Spring是一个开源容器框架,可以接管web层,业务层,dao层,持久层的组件,并且可以配置各种bean,和维护bean与bean之间的关系。其核心就是控制反转(IoC),和面向切面(AOP),简单的说就是一个分层的轻量级开源框架。 …