news 2026/10/11 1:48:10

《计算机是如何工作的:人人都能懂的计算机软硬件工作原理》第 7 章 计算机硬件 阅读笔记 7

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
《计算机是如何工作的:人人都能懂的计算机软硬件工作原理》第 7 章 计算机硬件 阅读笔记 7

《计算机是如何工作的:人人都能懂的计算机软硬件工作原理》第 7 章 计算机硬件 阅读笔记 7

第 7 章 计算机硬件

前面的章节介绍了计算机的基本要素—二进制、数字电路和存储器。
现在,我们来看看这些要素是如何在计算机中组合在一起的,计算机不仅仅是其组件之和。
本章首先概括地介绍一下计算机硬件,然后深入研究计算机的三种组件:主存(主存储器)​、处理器和输入/输出。

7.1 计算机硬件概述

我们先概括地介绍一下计算机与其他电子设备的不同之处。
之前,我们已经了解了如何使用逻辑电路和存储设备来搭建电路,使之执行有用的任务。
我们用逻辑门搭建的电路的功能在设计上是硬连线的。
如果想增加或修改功能,就必须改变电路的物理设计。
这在面包板上是可以实现的,但是对于已经制造出来并交给用户的设备而言,通常不会选择改变硬件。
仅在硬件中定义设备的功能限制了我们快速创新和改进设计的能力。

到目前为止,我们构造的电路使我们得以一窥计算机的工作原理,但我们忽略了计算机的一个关键要素:可编程性。
也就是说,计算机必须能够在不改变硬件的前提下执行新任务。
为了实现这一非凡的功能,计算机必须能接受一组指令(程序)并执行由它们指定的操作。
因此,它必须有能按照程序指定顺序执行各种操作的硬件。
可编程性是区分计算机设备与非计算机设备的关键。
本章将讨论计算机硬件,即计算机的物理组成部分。
这与软件相反,软件是告诉计算机做什么的指令,我们将在第 8 章讨论。

运行软件的能力把计算机与固定用途的设备区别开来。
也就是说,软件仍然需要硬件,那么,在实现一台通用计算机时需要怎样的硬件呢?
首先,我们需要存储器。我们已经介绍了 1 位存储设备,比如锁存器和触发器,计算机中的存储器类型是这些简单存储设备在概念上的扩展。
计算机中使用的主存储器被称为主存,不过,我们一般把它叫作内存或随机存取存储器 (Random Access Memory,RAM)。
它是易失性的,这意味着它只在通电的时候才能保持数据。​“随机存取” 表明访问存储器内任意位置需要的时间大致相同。

然后,我们需要中央处理器 (Central Processing Unit,CPU),这是第二个关键组件,通常简称为 “处理器”​,这个组件执行软件中指定的指令。CPU 可以直接访问主存。
现在,大多数处理器都是微处理器,即单个集成电路上的多个 CPU。单集成电路上的 CPU 具有降低成本、提高可靠性和增强性能的优点。CPU 是我们之前介绍的数字逻辑电路在概念上的扩展。

尽管主存和 CPU 是计算机的最低硬件需求,但实际上大多数计算机设备都需要与外部世界进行交互,而这就需要输入/输出 (I/O) 设备。本章将详细地介绍主存、CPU和 I/O 设备。图 7-1 展示了这三个组件。

图 7-1 计算机的硬件组件

7.2 主存

在执行程序的时候,计算机需要一个地方来存放程序的指令和相关数据。
例如,当计算机运行文字处理器来编辑文档时,计算机需要一个地方来保存文档内容和编辑状态——文档的哪些部分是可见的、光标的位置等。所有这些数据最终都会变成 CPU 可以访问的一系列位。

让我们探讨一下内存是如何在计算机中工作的。
计算机内存有两种常用类型:静态随机存取存储器 (SRAM) 和动态随机存取存储器 (DRAM)。
在这两种类型中,基本单位都是存储单元 (memory cell),即可以存储一个位的电路。
在 SRAM 中,存储单元是触发器。SRAM 是静态的,因为它的触发器存储单元在通电时能保持其位值。
DRAM 存储单元是利用晶体管和电容器实现的。随着时间的推移,电容器的电荷会泄漏,所以必须定期把数据重写入存储单元。这种存储单元的刷新使得 DRAM 是动态的。
现在,由于其相对较低的价格,DRAM 通常用作内存。SRAM 更快,但是更贵,所以用于速度至关重要的场景,比如用作高速缓存,我们将在后面介绍它。图 7-2 展示了一个 RAM “条” 的例子。

图 7-2 随机存取存储器

总的来说,你可以把 RAM 的内部想象成一个由存储单元组成的网格。
网格中每个 1 位单元都可以用二维坐标(其在网格中的位置)来标识。
一次访问一位的效率很低,所以 RAM 并行访问多个 1 位存储单元的网格,允许同时读或写多个位——比如整个字节。
内存中一组位的位置被称为内存地址,它是一个标识内存位置的数值。
内存通常是按字节编址的,即一个内存地址指的是一个 8 位的数据。
内存布局的内部细节或内存的实现对于 CPU(或程序员)而言不是必须了解的知识!主要应理解的是计算机把数值地址分配给内存字节,而CPU 可以读写这些地址,如图 7-3 所示。

图 7-3 CPU 从内存地址读取一个字节

让我们假设一个虚拟计算机系统,它的寻址范围可以达到 64 KB。
按照如今的标准,这对计算机来说是一个很小的内存,但作为示例足够了。
我们假设这个虚拟计算机的内存是按字节寻址的,每个内存地址都代表一个字节。
这就意味着我们要为每个字节提供一个唯一的内存地址,由于 64KB 等于 64×1024 = 65536 字节,因此我们需要 65536 个地址。
每个地址都是一个数字,内存地址一般从 0 开始,所以我们的地址范围是 0~65535(0xFFFF)。

由于这个虚构的 64 KB 计算机是数字设备,因此内存地址最终用二进制来表示。
在这个系统中,我们需要多少位来表示内存地址呢?n 位二进制数可以表示的值的数量为 2n。
因此,我们需要知道 2n=65536 时的 n 值。
2 的某次方的逆运算就是以 2 为底的对数。因此,log2log_2log2​n=n,而log2log_2log2​(65536)=16,即 216=65536。需要 16 位的内存地址来寻址 65536 个字节。

或者再简单一点,由于我们已经知道最高编号的内存地址为 0xFFFF,且我们还知道每个十六进制符号代表 4 个位,因此我们可以看出需要 16位。同样,虚构的计算机可以寻址 65536 个字节,每个字节分配一个 16 位的内存地址。表 7-1 给出了 16 位内存地址布局的一些示例数据。

表 7-1 带示例数据的 16 位内存地址布局(跳过中间地址)

内存地址(二进制)内存地址(十六进制)示例数据
0000 0000 0000 00000000H7AH
0000 0000 0000 00010001HC3H
0000 0000 0000 00100002H19H
………
0000 0100 0000 00000400HB7H
………
0001 0010 0011 01001234H5EH
………
1111 1111 1111 1110FFFEHD2H
1111 1111 1111 1111FFFFH8FH

为什么位数很重要?表示内存地址的位数通常是计算机设计中关键的一环。
它限制了计算机可以访问的内存容量,并影响着程序在底层对内存的处理。

我们假设虚拟计算机从内存地址 0x0002 开始存放了一个 ASCII 字符串 “Hello”​。
由于每个 ASCII 字符都需要 1 个字节,因此保存 “Hello” 就要 5 个字节。
在查看内存时,一般用十六进制来表示内存地址和这些内存地址的内容。
表 7-2 提供了从地址 0x0002 开始存放的 “Hello” 的直观视图。

表 7-2 存储在内存中的 “Hello”

内存地址数据字节ASCII 数据
000000
000100
000248H
000365e
00046Cl
00056Cl
00066Fo
000700
……
FFFF00

使用这种格式可以清楚地表明一个地址只保存一个字节,所以存放 5 个 ASCII 字符所需的地址就是从 0x0002 到 0x0006。
请注意,表 7-2 把其他内存地址中的值表示为 00,但实际上,假设随机地址保存 0 是不安全的,它可能是任何值。

允许检索计算机内存的应用程序一般以类似于图 7-4 所示的格式来表示内存的内容。
图 7-4 内存字节的典型视图

图 7-4 中最左边的一列是用十六进制表示的内存地址,随后的 16 个值表示该地址及其后 15 个地址中的字节值。
这种表示方法比表 7-2 更为紧凑,但它意味着每个地址并不是唯一被表示出来的。
在图 7-4 中,我们再次看到 ASCII 字符串 “Hello” 从地址 0x0002 开始存放。

我们假设的 64KB RAM 计算机作为例子足够了,但是现代计算设备往往具有大得多的内存。

7.3 中央处理器

内存为计算机提供了一个存放数据和程序的地方,而执行这些指令的是 CPU 或处理器。
正是处理器使得计算机能灵活地运行程序,这些程序在设计处理器时甚至都没有被想到。
处理器实现一组指令,然后程序员可以用这些指令来构建有意义的软件。
尽管每条指令都很简单,但是这些基本指令是构建所有软件的基石。

下面是 CPU 支持的一些指令类型:

  • 内存访问:读、写指令(对内存)​。
  • 算术运算:加、减、乘、除、递增。
  • 逻辑运算:AND、OR、NOT。
  • 程序流:跳转(到程序特定的部分)​、调用(某个子程序)​。

我们将在第 8 章讨论具体的 CPU 指令,但现在的重点是了解 CPU 指令仅仅是处理器可以执行的操作。
它们相当简单(如两数相加、从内存地址读取数据、执行逻辑 AND 运算等)​。
程序由这些指令的有序集合组成。用烹饪来类比的话,那么,CPU 是厨师,程序是菜谱,程序中的每条指令就是菜谱上的一个步骤,厨师知道如何执行这些步骤。

程序指令驻留在内存中。CPU 读取这些指令,这样它就能运行程序。图 7-5 展示了一个由 CPU 从内存中读取的简单程序。

图 7-5 从内存读取示例程序并在 CPU 上运行

图 7-5 中的示例程序是用伪代码编写的,它不是用真正的编程语言编写的,而是一种人类可读的程序描述。
该程序中的几条指令分别属于前述的类型(内存访问、算术运算、逻辑运算和程序流)​。
程序首先读取保存在内存特定地址中的数,然后在这个数上加 3,之后执行两个条件的逻辑与运算。
如果逻辑运算结果为真,那么程序将执行 this;否则,程序将执行 that。
不管你是否相信,所有的程序本质上都只是这些基本类型的各种组合。

7.3.1 指令集架构

尽管所有的 CPU 都实现了这些指令类型,但是不同处理器可用的指令还是有所不同。
在一种 CPU 上存在的一些指令在另一种 CPU 上根本就不存在。
甚至两种 CPU 上都有的指令其实现方式也不尽相同。

例如,用于表示 “两数相加” 的特定二进制位序列在不同类型的处理器上是不同的。
使用相同指令的一系列 CPU 共享一个指令集架构 (Instruction Set Architecture,ISA)——简称架构,它是表示 CPU 工作原理的模型。
为特定 ISA 构建的软件可以在实现该 ISA 的任何 CPU 上运行。
对于多种处理器模型,甚至不同制造商的处理器模型而言,都可以实现相同的架构。
这样的处理器的内部工作方式可能差异很大,但通过遵循相同的 ISA,它们可以运行相同的软件。
当前有两种主流的指令集架构:x86 和 ARM。

大多数台式计算机、笔记本计算机和服务器都使用 x86 CPU。
该名称来源于 Intel 公司对其处理器的命名约定(每个处理器名称都以 86 结尾)​,
如从 1978 年发布的 8086 到后来的 80186、80286、80386 和 80486。

在 80486(简称 486)之后,Intel 开始用诸如 Pentium 和 Celeron 等名称来命名其处理器,虽然名称变了,但这些处理器仍然是 x86 CPU。Intel 之外的其他公司也生产 x86 处理器,特别是 Advanced Micro Devices(AMD) 公司。

术语 x86 指的是一组相关的架构。
随着时间的推移,新的指令被添加到 x86 架构中,但每一代架构都试图保持向后兼容性。
这通常意味着在较早 x86 CPU 上开发的软件可以在较新的 x86 CPU 上运行,但是利用了新 x86 CPU 指令,在较新的 x86 CPU 上开发的软件则不能在较早的 x86 CPU 上运行,它们不能理解这些新的指令。

x86 架构主要包括三代处理器:16位、32 位和 64 位处理器。
让我们暂停一下,看看CPU 是 16 位、32 位或 64 位处理器是什么意思。
与处理器相关的位数——也称为它的位数或字长,是指处理器一次可以处理的位数。
因此,32 位 CPU 可以操作长度为 32 位的数值。
再具体一点,这表示计算机架构具有 32 位寄存器、32 位地址总线或 32 位数据总线,或者这三者都是 32 位的。
我们将在后面详细讨论寄存器、数据总线和地址总线。

回到 x86 架构及其几代处理器,最初在 1978 年发布的 8086 处理器是 16 位处理器。
受到 8086 的鼓舞,Intel 继续生产了兼容的处理器。
Intel 后续的 x86 处理器也是 16 位的,直到 1985 发布了 80386 处理器,它采用了新的 32 位版 x86 架构。
32 位版的 x86 有时也被称为 IA-32。多亏了向后兼容性,现代 x86 处理器仍然支持 IA-32。图 7-6 展示了 x86 处理器的一个例子。

图 7-6 Intel 486 SX(一个 32 位 x86 处理器)

有意思的是,是 AMD 而不是 Intel 把 x86 带入 64 位时代。
在 20 世纪 90 年代末,Intel 的 64 位研究重点放在一种新的 CPU 架构上,这种架构被称为 IA-64 或 Itanium,但它不是 x86ISA,最终它成了服务器的定制产品。
在 Intel 关注 Itanium 时,AMD 抓住机会扩展了 x86 架构。
2003 年,AMD 发布了第一款 64 位的 x86 CPU——Opteron 处理器。
AMD 的架构最初被称为 AMD64,后来 Intel 采用了这个架构并把它称为 Intel 64。这两种实现在功能上基本相同,现在 64 位的 x86 通常称为x64 或 x86-64。

尽管 x86 统治了个人计算机和服务器世界,但 ARM 处理器主宰了智能手机和平板电脑等移动设备领域。
很多公司都生产 ARM 处理器。一家名为 ARM Holding 的公司开发了 ARM 架构,并将其设计授权给其他公司来实现。
ARM CPU 通常用于片上系统 (System-on-Chip,SoC) 设计,这里,单个集成电路不仅包含 CPU,还包含内存和其他硬件。
ARM 架构作为 32 位 ISA 起源于 20 世纪 80 年代。ARM 架构的 64 位版本于 2011 年推出。
相比于 x86 处理器,由于降低了功耗和成本,ARM 处理器在移动设备中很受欢迎。
ARM 处理器也可以用于PC,但为了保持与现有 x86 PC 软件的向后兼容性,市场主要还是集中在 x86 上。
不过在 2020 年,Apple 宣布它们打算把 macOS 计算机从 x86 迁移到 ARM CPU 上。

7.3.2 内部结构

在内部,CPU 由多个组件构成,这些组件协同工作以执行指令。
我们将关注三个基本组件:处理器寄存器、算术逻辑单元和控制单元。
处理器寄存器位于 CPU 里面,在处理过程中保存数据。
算术逻辑单元 (Arithmetic Logic Unit,ALU) 执行逻辑和算术运算。
处理器控制单元指挥 CPU,并和处理器寄存器、ALU 和内存通信。
图 7-7 显示了 CPU 架构的简化示意图。

图 7-7 CPU 架构的简化示意图

现在来看处理器寄存器。
内存保存正在执行的程序的数据。
但是,当程序要对一段数据进行操作时,CPU 需要在处理器硬件中设置一个临时的位置来存放数据。
为了达到这个目的,CPU 有一些小型的内部存储位置,它们被称为处理器寄存器(简称 “寄存器”​)​。
与访问内存相比,CPU 访问寄存器是非常快的操作,但是寄存器只能存放少量的数据。
由于寄存器太小了,因此衡量每个寄存器大小的单位是位而不是字节。
例如,32 位 CPU 通常有 32 位 “宽” 的寄存器,这表示每个寄存器可以保存 32 位的数据。
寄存器是在被称为寄存器文件(不要和文档或图片等数据文件搞混)的组件中实现的。寄存器文件中使用的存储单元一般是 SRAM。

ALU 在CPU内部处理逻辑和算术运算。
我们之前介绍过组合逻辑电路,其输出是输入的函数。
处理器的 ALU 就是一个完整的组合逻辑电路。
ALU 的输入是被称为操作数的数值,以及指示要对这些操作数执行哪种操作的编码。
ALU 输出该操作的结果和状态信息,这个状态信息提供了关于操作执行的更多细节。

控制单元是 CPU 的协调器。它以循环方式工作:从内存取一条指令,对该指令进行译码,然后执行它。
由于正在运行的程序保存在内存中,因此控制单元需要知道读取哪个内存地址来取出下一条指令。
控制单元通过查看一个被称为程序计数器 (Program Counter,PC) 的寄存器来确定这个地址,该寄存器在 x86 中也被称为指令指针。
程序计数器存放下一条要执行的指令的地址。
控制单元从指定的内存地址读取指令,把该指令存入被称为指令寄存器的寄存器中,并更新程序计数器使其指向下一条指令。
然后,控制单元对当前指令进行译码,理解表示指令的1和0的含义。
译码后,控制单元执行指令,这可能需要 CPU 中其他组件的协作。
例如,执行加法运算就需要控制单元指示 ALU 执行所需的算术运算。
一旦指令完成,控制单元就重复这个循环:取指、译码、执行。

7.3.3 时钟、内核和高速缓存

由于 CPU 执行有序的指令集,你可能想知道是什么使得 CPU 从一条指令前进到下一条指令。
我们之前演示了如何利用时钟信号让电路从一个状态进入另一个状态,比如在计数器电路中。
同样的原理在这里也适用。CPU 接收输入的时钟信号,如图 7-8 所示,时钟脉冲作为提供给 CPU 的信号,使其在状态间转换。

图 7-8 时钟为CPU提供振荡信号

认为 CPU 每个时钟周期只执行一条指令是过于简单的想法。
有些指令需要多个周期才能完成。
此外,现代 CPU 使用一种被称为流水线的方法,把指令分为更小的步骤,这样一条指令的多个步骤就可以由一个处理器并行运行。
例如,处理器可以在取一条指令的同时对另一条指令进行译码并执行第三条指令。
不过,把时钟的每个脉冲都看作使 CPU 在执行程序时前进的信号还是有帮助的。
现代 CPU 的时钟频率以 GHz 为单位。例如,2GHz 的 CPU 的时钟每秒振荡 20 亿次!

提高时钟频率会让 CPU 在单位时间内执行更多的指令。
可惜的是,我们不能以任意高的时钟频率来运行 CPU。
CPU 的输入时钟频率有上限,当超过这个上限时,CPU 会产生过多的热量。
而且,CPU 的逻辑门也可能跟不上,导致意外的错误和崩溃。
多年来,计算机行业中的 CPU 时钟频率上限在稳步提高。
这种时钟频率的提高很大程度上是由于制造工艺的定期改进导致了晶体管密度的增加,这就使得 CPU 能具备更高的时钟频率,同时其功耗又大致保持不变。
1978年,Intel 8086 的时钟频率为 5 MHz,到了 1999 年,Intel PentiumⅢ 的时钟频率为 500 MHz,
仅用了大约 20 年时钟频率就提高了 100 倍!
之后,CPU 时钟频率继续快速提高,直到 2000年 初超过了 3 GHz 的阈值。
从那时起,尽管晶体管的数量还在持续增加,但与晶体管尺寸有关的物理上限使得显著提升时钟频率变得不现实。

随着时钟频率上限趋于稳定,处理器设计者开始寻求一种新方法来让 CPU 完成更多的工作。
CPU 的设计不再关注如何提高时钟频率,而是开始关注多条指令的并行执行。
人们提出了多核 CPU 的概念,这种 CPU 具有多个处理单元,各处理单元被称为内核。
如图 7-9 所示,CPU 内核实际上是一个独立的处理器,它与其他独立处理器一起存在于一个 CPU 封装中。

图 7-9 四核 CPU——每个内核都有自己的寄存器、ALU 和控制单元

请注意,并行运行的多个内核与流水线是不一样的。多核的并行性意味着每个内核处理不同的任务,即处理一组不同的指令。
相反,流水线是发生在每个内核中的,它允许一个内核并行执行一条指令的多个小步骤。

添加到 CPU 处理器的每个内核都打开了一扇通向计算机并行执行其他指令的门。
也就是说,向计算机的 CPU 添加多个内核并不意味着所有的应用程序都会立即或同等受益。
必须编写软件来利用并行处理指令的优势,以获得多核硬件的最大收益。
但是,即使单个程序的设计没有考虑并行性,整个计算机系统也可以受益,因为现代操作系统一次会运行多个程序。

我之前描述过 CPU 是如何把数据从内存加载到寄存器进行处理,然后再把数据从寄存器存回到内存以备后续使用的。
事实证明,程序往往会一次又一次地访问相同的内存位置。正如你所预料的,多次返回内存来访问相同的数据是低效的!
为了避免这种低效,CPU 中驻留了小容量的存储器以保存经常被访问的内存数据的副本。这种存储器被称为 CPU 的高速缓存。

处理器会检查高速缓存,以查看其想要访问的数据是否在其中。
如果在,处理器就可以通过读写高速缓存而不是内存来加快访问速度。
当需要的数据不在高速缓存中时,处理器可以在从内存中读取该数据后把它放到高速缓存中。
常见的处理器有多级高速缓存,一般是三级。
我们把这些高速缓存划分为 L1 高速缓存、L2 高速缓存和 L3 高速缓存。
如图 7-10 所示,CPU 首先查找 L1 是否有所需数据,然后查找 L2,再然后查找 L3,最后才查找内存。
L1 高速缓存的访问速度是最快的,但它的容量也是最小的。L2 的速度较之慢一些,但容量要大一些,L3 则速度更慢,容量更大。
请记住,即使是这些逐渐变慢的高速缓存,它们的访问速度也比内存访问速度要快。

图 7-10 具有三级高速缓存的单核 CPU

在多核 CPU 中,有些高速缓存是专属每个内核的,有些则在内核之间共享。
例如,每个内核都有自己的 L1 高速缓存,而 L2 和 L3 高速缓存则是共享的,如图 7-11 所示。

图 7-11 带高速缓存的双核 CPU。每个内核都有自己的 L1 高速缓存,而 L2 和 L3 高速缓存则是共享的

7.4 其他组件

我已经概括地叙述了计算机所需的两个基本组件:内存和处理器。
但是,只有内存和处理器的设备与我们想要的有用设备之间还有些差距。
第一个差距是,内存和 CPU 都是易失性的,它们在断电后就会丢失状态。
第二个差距是,只有内存和处理器的计算机是无法与外界进行交互的。
现在让我们看看辅存和 I/O 设备是如何填补这些差距的。

7.4.1 辅存

如果计算机只包含内存和处理器,那么每次设备断电时,它就会丢失所有的数据!
为了强调这一点,这里的 “数据” 不仅是指用户的文件和设置,还包括已安装的应用程序,甚至是操作系统本身。
这种相当不方便的计算机在每次开机时都需要人加载 OS 和应用程序。这可能会阻止用户关闭机器。
不管你是否相信,前几代计算机就是这么工作的,但幸运的是,现在的工作方式不是这样的。

为了解决这个问题,计算机使用了辅存。辅存是非易失性的,所以即使在系统断电时,它也能保存数据。
与 RAM 不同,辅存不是直接由 CPU 寻址的。相比于 RAM,通常这种存储器单位容量的价格更加便宜;
与内存相比,它能有更大的存储容量。但是,辅存比 RAM 慢得多,它不适合替代内存。

在现代计算机设备中,硬盘驱动器和固态驱动器是最常见的辅存设备。
硬盘驱动器 (Hard Disk Drive,HDD) 用高速旋转磁盘上的磁性来存储数据,
固态驱动器 (Solid-State Drive,SSD) 用非易失性存储单元中的电荷来存储数据。
与 HDD 相比,SSD 更快,更安静,更能容忍机械故障,因为 SSD 没有移动部件。
图 7-12 是两个辅存设备的照片。

图 7-12 一个 1997 年的 4 GB 硬盘驱动器和一个现代 32 GB MicroSD 卡(一种固态存储器)

有了辅存,计算机就可以按需加载数据。
当一台计算机上电时,操作系统将数据从辅存加载到内存,任何被设置为启动时运行的应用程序也会被加载。
启动后,当应用程序运行时,程序代码会从辅存加载到内存。
这也适用于本地存储的任何用户数据(文档、音乐、设置等)​,这些数据必须从辅存加载到内存,然后才能被使用。
在通常的用法中,辅存一般简称为存储器,而内存(内存储器)/主存(主存储器)则简称为内存或 RAM。

7.4.2 输入/输出

即使使用了辅存,目前假设的计算机还存在一个问题。一个由处理器、内存和辅存构成的计算机无法与外界交互!
这就需要输入/输出 (I/O) 设备了。I/O 设备是一种组件,它允许计算机从外界接收输入(键盘、鼠标)​,向外界发送数据(显示器、打印机)​,或两者皆可(触摸屏)​。
人与计算机的交互需要通过 I/O 设备实现。
计算机与计算机的交互也需要通过 I/O 设备实现,一般是以计算机网络(比如互联网)的形式实现。
辅存设备实际上是一种 I/O 设备。你可能不会把访问内部存储器看作输入/输出,但从 CPU 的角度来看,读写存储器只是另一种 I/O 操作。
从存储设备读取数据是输入,向存储设备写入数据是输出。图 7-13 给出了一些输入和输出的例子。

图 7-13 输入和输出的常见类型

那么 CPU 是如何与 I/O 设备进行通信的呢?计算机可以连接多种多样的 I/O 设备,它需要一种标准方式来与这些设备进行通信。
为了理解这一点,我们需要先讨论一下物理地址空间,即计算机可用的硬件存储器地址范围。
在 7.2 节中,我们已经介绍了内存字节是如何分配地址的。
给定计算机系统上全部内存地址都会用一定数量的位来表示。
位的数量不仅决定了每个内存地址的大小,而且决定了计算机硬件可用地址的范围——物理地址空间。
地址空间通常大于计算机内部安装的 RAM 容量,从而留下一些未使用的物理内存地址。

例如,若一台计算机有 32 位的物理地址空间,则其物理地址范围为从 0x00000000 到 0xFFFFFFFF(32 位数能表示的最大地址)​。
这大约有 40 亿个地址或 4 GB 的地址空间,其中的每个地址都代表一个字节。
假设这台计算机有 3 GB 的 RAM,那么 75% 的可用物理地址被分配给了 RAM 字节。

现在让我们回到计算机是如何与 I/O 设备进行通信的这个问题上。
物理地址空间中的地址并不总是指向内存字节,它们也可以指向 I/O 设备。
当物理地址空间被映射到 I/O 设备时,CPU 只需对分配给其的内存地址进行读写就可以与该设备通信,
这被称为内存映射 I/O(Memory-Mapped I/O,MMIO),如图 7-14 所示。
当计算机把 I/O 设备的存储空间看作内存时,它的 CPU 就不需要任何专用的 I/O 操作指令。

图 7-14 内存映射 I/O

但是,有些 CPU 系列,特别是 x86,确实包含了访问 I/O 设备的专用指令。
当计算机使用这种方式时,它不是把 I/O 设备映射到物理内存地址,而是给设备分配一个 I/O 端口。
端口就像是一个内存地址,但它不是指向内存中的位置,而是指向 I/O 设备。
你可以把 I/O 端口集合看作另一个地址空间,它和内存地址不在一个空间。这意味着端口 0x378 与物理内存地址 0x378 指的不是同一个东西。通过独立的端口地址空间访问 I/O 设备被称为端口映射 I/O(Port-Mapped I/O,PMIO)。
当前,x86 CPU 同时支持端口映射 I/O 和内存映射 I/O。

I/O 端口地址和内存映射 I/O 地址通常指向设备控制器,而不是直接指向存储在设备上的数据。
例如,对于硬盘驱动器来说,磁盘的字节不会直接映射到地址空间。
相反,硬盘驱动器的控制器提供一个通过 I/O 端口或内存映射 I/O 地址可以访问的接口,从而允许 CPU 请求对磁盘位置进行读写操作。

7.5 总线通信

到目前为止,我们已经介绍了计算机中的内存、CPU和 I/O 设备。
我们还探讨了 CPU 通过内存地址空间与内存和 I/O 设备之间的通信。
现在,让我们进一步讨论一下 CPU 是如何与内存和 I/O 设备通信的。

总线是计算机组件使用的一种硬件通信系统。
总线的实现方式有多种,但在计算机发展的早期,总线只是一组并列的导线,每根导线携带一个电信号。
每根导线上的电压表示一个位,这就使得多个数据位能并行传输。
现在的总线设计并不总是这么简单,但其意图与之类似。

CPU、内存和 I/O 设备之间的通信经常使用三种常见的总线类型。
地址总线充当选择器,用于选择 CPU 想要访问的内存地址。
例如,如果程序希望向地址 0x2FE 写入数据,那么 CPU 就把 0x2FE 写到地址总线上。
数据总线传送从内存读出的值以及向内存写入的值,所以如果 CPU 想要把值 25 写入内存,那么 25 就会被写到数据总线上,
如果 CPU 正在从内存读取数据,那么 CPU 就从数据总线上读取这个值。
控制总线管理发生在其他两种总线上的操作。
例如,CPU 用控制总线来指示一个写操作即将发生,控制总线可以携带一个信号来指示某个操作的状态。
图 7-15 展示了 CPU 是如何使用地址总线、数据总线和控制总线来读取内存的。

图 7-15 CPU 请求读取地址 000003F4 中的值,得到返回值 84

在图 7-15 展示的例子中,CPU 需要读取内存地址 000003F4 中存储的值。
为此,CPU 把 000003F4 写到地址总线。
CPU 还要在控制总线上设置一个特定的值,指示它希望执行一个读操作。
这些总线的更新值作为内存控制器(管理与内存的交互的电路)的输入,告诉控制器 CPU 想要读取存储在内存地址 000003F4 中的值。
作为回应,内存控制器检索存储在地址 000003F4 中的值(本例中为 84)​,并把它写到数据总线上,然后 CPU 可以从总线上读取该值。

7.6 总结

本章介绍了计算机硬件:执行指令的中央处理器 (CPU)、在上电时保存指令和数据的随机存取存储器 (RAM),
以及与外界交互的输入/输出 (I/O) 设备。
你了解了内存由单个位存储单元组成,SRAM 中用触发器实现存储单元,DRAM 中用晶体管和电容器实现存储单元。
我们还介绍了内存地址是如何工作的,其中的每个地址都指向一个内存字节。
你了解了 CPU 架构,包括 x86 和 ARM。
我们探讨了 CPU 内部是如何工作的,了解寄存器、ALU 和控制单元。
我们介绍了辅存和其他类型的 I/O 设备。最后,我们还讨论了总线通信。

第8章将从硬件转到使计算机独一无二的元素——软件。
我们将讨论处理器执行的底层指令,以及这些指令是如何组合在一起来执行有用的操作的。
你将有机会用汇编语言编写软件,并用调试工具来探究机器码。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/11 1:48:09

C++模拟实现list保姆级教程,带你避开所有坑!

注意事项list是需要模版来实现的容器,所以申明与定义必须处于同一文件下,否则会出现:“error: undefined reference to ...”错误原因:模版函数调用需要实例化,而实例化需要看到定义,但如果定义放在其它文件…

作者头像 李华
网站建设 2026/10/11 1:48:06

医疗文本分类实战:MIMIC-IV上word2vec+轻量Transformer端到端落地

简介:本资源是一套面向自然语言处理初学者与医疗AI实践者的PyTorch实战项目,聚焦英文医学影像报告文本分类任务,适用于高校学生、NLP入门开发者及医疗信息化方向研究者。项目基于真实临床数据集MIMIC-IV,完整实现从Word2Vec词向量…

作者头像 李华
网站建设 2026/10/11 1:47:30

DLP和沙箱检测

一、定义 1. DLP 规则(数据防泄露规则) DLP(Data Loss Prevention),俗称“数据防泄露”系统。它的核心目的是防止公司的敏感数据被内部人员有意或无意地传出去。 2. 沙箱规则(虚拟环境运行) 沙…

作者头像 李华
网站建设 2026/10/11 1:47:14

数字工厂规划蓝图:69页PPT背后的可执行技术契约

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/11 1:46:49

精选 21道 Redis 最常问面试题!

Redis 作为后端开发面试中的高频考点,几乎每一次 Java、Go、Python、Node.js 岗位面试都会涉及。它不仅是缓存组件,更在分布式锁、消息队列、排行榜、计数器、限流等场景中发挥着重要作用。本文精选了 21 道 Redis 最常问的面试题,覆盖基础概…

作者头像 李华