计算机组成原理 & 体系结构
这学期的计组,计网,数据库系统、操作系统覆盖面广,知识零碎,概念繁多。为了有效扎实掌握这些基础知识,这学期采用每节课课后总结的方式进行巩固强化,并回答课本上课后提问的方式。以往的方法只是将知识全面整理上网,这种旧做法感觉太过机械。考虑到换另一种方式会不会更加灵活,适应课本和科目特点,同时加入尽可能的实践和练习。
Week1:绪论(chap1)
为什么学习计算机组成原理?
“若想理解一个算法为什么是不可行的,或者理解一个可行的算法为什么运行太慢,你必须能够从计算机的观点来看这个程序。”
- 计算机体系结构,集中于计算机体系结构和行为的研究,是从程序员的角度看到的系统实现的逻辑和抽象。
- 指令集架构,ISA是机器上运行的软件与执行软件的硬件之间共同认可的接口,ISA允许你与机器进行对话。
硬件和软件等价原理:
任何由软件完成的任务也能使用硬件完成,并且任何直接由硬件完成的操作也可以使用软件完成。
摩尔定律:
硅芯片的密度每18个月就会翻一番。
罗克定律:建立半导体工厂的主要设备的成本每四年就翻一番。
计算机层次结构
通过抽象原理,把机器的构造想象为由不同的层次构成,每一层都有自己的特殊指令集,再需要的时候要求下层机器执行任务。


Week2:计算机系统中的数据表示
计数系统:
一个数,都可以根据唯一展开法,表述成n的幂次的一个多项式,其中的系数就是这个数的n进制表示。
将这个原理推广到小数,用n的负幂次的多项式表示小数部分。
整数表示:
有符号:
正数的原码、反码、补码相同,负数的补码就是在原码基础上,符号位不变,按位取反再加1。
具体的原理取决于加法器的硬件设计。
进位和溢出
对于确定进位何时表示错误的方法取决于使用的是有符号数还是无符号数。
对于无符号数,一个进位(从最左边出来的)表示位的总数不够大不足以保存结果值,并发生溢出。
对于有符号数,如果进入符号位和从符号位出来的进位不同,则发生溢出。
进位和溢出彼此独立地发生。
浮点数表示:
科学计数法简化了非常大或非常小的数字的手算过程。它也是当今数字计算机中浮点运算的基础。
不同于连续的实数域,计算机是带有有限存储空间的有限系统。当我们让计算机执行浮点运算时,我们是在有限的整数系统中对实数的无限系统建模。
浮点数由三部分组成:符号位、指数部分、小数部分(尾数/有效数)。
由于这种方式无法唯一地表示每一个数字,IEEE-754将浮点数规范——隐含1
这种方式有以下好处和缺点:
- 规范化
- 获得了额外的一位精度
- 无法表示0
因此——IEEE-754对一些特殊的数的表示进行了规定,并采取127的指数移码。
浮点数可以完全工作的原理是:在这个范围内总会有一个数接近你想要的数。
表数范围、准确度、精度
注意浮点数的表数范围——有两个上界和下界
准确度必须放在上下文中
更高的精度通常使值更准确,但并不总是这样。
浮点数运算问题
浮点数运算不具备分配律和结合律
浮点数的舍入问题可以传播,并导致实质问题——因此避免在for循环,while循环中对浮点数进行运算
最好的做法是声明接近,比如epsilon=0.000001,if(abs(x-1) < epsilon)then……
这里也可以发现浮点二分算法要这样写的原因。
“对浮点异常深刻的理解可以毫不夸张地说就是在保护生命。“
字符编码
EBCDIC
在硬件之间传输数据——EBCDIC
二进制编码的十进制(BCD)能够降低错误率——详见数电,因此在电子学中非常普遍。
为了保持与早期计算机和外围设备的兼容性并拓展计算机的性能,IBM工程师将BCD由6位扩展到8位。得到EBCDIC
ASCII
在系统之间传输数据——ASCII(美国信息交换标准码)
ASCII定义了32个控制字符的代码、10位数字、52个字母、32个特殊字符和空格字符。高阶位用于奇偶校验。
奇偶校验是所有错误检测方案中最基本的。
Unicode
在不同语言之间的字符表示——Unicode
错误检测与纠错
随着传输速率的增加,位传输更紧密,要实现完全无错误,在物理上是不可能的。
ASCII字节中的奇偶校验码只能检测到字节中的奇数个错误。如果发生两个错误,我们无法检测出。
循环冗余校验(CRC)——错误检测编码
循环冗余校验是一种校验和,校验和用于各种各样的编码系统——从条形码到国际标准图书编号——都是自检码。
循环和循环冗余校验是两种类型的系统错误检测方案——错误检查位被附加到原始信息字节上了。
计算和使用CRC是这里一大考点。
汉明码——错误恢复编码
在数据通信中,只要有错误检测的能力就可以
在磁盘系统中,存储设备和主存必须具备不仅可以检测还能纠正一定数量错误的能力。
汉明距离是指在两个码字中有多少位不同。
一个编码系统的错误检测和纠正能力取决于最小汉明距离D(min)
Week3:一个简单的计算机模型MARIE
第一章:计算机系统进行了总体概述
第二章:数据表示方法以及存储处理方法
第三章:数字电路的基本组成成分
现在,组合这些背景知识,讨论一个直观简单的计算机模型=>MARIE=>Machine Architecture that is Really Intuitive and Easy
CPU基本知识和组织结构
CPU由两部分组成:
数据通路——一个由存储单元和算术逻辑单元组成的网络
控制单元——对各种操作进行控制的结构
关于总线仲裁机制
- 1.菊花链仲裁方式(Daisy chain arbitration)
设计使用一个“总线允许”控制线,该总线是从最高优先级设备传给最低优先级。 - 2.集中式并行仲裁(centralized parallel arbitration)
每个设备都有个到总线的请求控制线和一个选择谁可以用总线的仲裁控制器。(可能导致瓶颈) - 3.自选择的分配式仲裁(Distributed arbitration using self-selection)
类似于集中仲裁,但不是通过中央控制器选择,而是设备本身决定谁具有最高优先级。 - 4.冲突检测的分配式仲裁(distributed arbitration using collision detection)
允许每个设备对总线发起请求。如果总线检测到任何冲突,设备必须发送另一个请求。(以太网使用这种方式)
关于存储器的寻址方式-交叉存储器
单个存储器模块只能串行访问(每次只能执行一次存储器访问)。交叉存储器可以缓解这个问题,它把存储器分成多个存储模块。,
其中多个模块可以同时访问。
在低位交叉,地址的低位用于选择模块;在高位交叉时,使用地址的高位选择模块。
现在,终于可以懂得原理了!
如果计算机采用按字节编址的体系结构,并且指令系统的结构字长大于一字节,则必须解决对其的问题。
这个问题本应在C语言程序设计中被讲到,具体来说就是长一些的结构体需要注意对其问题。
后来遇到是在计算机学院的问题求解实践课上,老师特别强调了对齐问题,很多大的项目不明原因崩溃最大问题之一——对其。
“例如,如果我们希望在按字节编址的计算机上读取32位长的字,我们必须确保字存储在自然对齐的边界上,并且访问从该边界开始。在字长32位的情况下,这是通过使地址为4的倍数来实现的。”
可以发现,C语言的运行表现是和机器类型直接相关的。编程时要特别注意。
指令的执行:
取指-译码-执行周期是计算机在运行程序时执行的一系列步骤
- 首先,我们需要从内存中取指令,并将其放入指令寄存器(IR)中。
- 一旦指令进入IR,它将被译码以确定接下来需要做什么。
- 如果操作涉及内存值(操作数),则将其检索并放入内存缓冲寄存器(MBR)中。
- 当所有内容就绪后,指令被执行。
中断:
由用户或系统发出的中断请求可以是可屏蔽中断(可以被禁止或忽略)或不可屏蔽中断,它可以在指令内或指令间发生,可以是同步(每次执行的同一位置)的也可以是异步(意外的)的。
不可屏蔽的中断是那些为了是系统保持稳定运行所必须被执行的。
Week4:MARIE模型
MARIE
MARIE 表示一个真正直观和简单的计算机体系结构。它包括存储程序和数据的 CPU(由一个 ALU 和几个寄存器组成)。它具有真正工作的计算机所必需的功能部件。
MARIE 具有下列特点:
- 使用二进制数和补码表示法
- 存储程序和采用固定的字长
- 指令(不是按字节的)编址
- 主存储器的容量为 4K 字(即每个地址需要使用 12 位二进制数)
- 16 位数据(16 位字)
- 16 位指令:4 位操作码和 12 位地址
- 一个 16 位的累加器(AC)
- 一个 16 位的指令寄存器(IR)
- 一个 16 位的存储器缓冲寄存器(MBR)
- 一个 12 位的程序计数器(PC)
- 一个 12 位的存储器地址寄存器(MAR)
- 一个 8 位的输入寄存器
- 一个 8 位的输出寄存器
这节课主要是图太多,PPT轮播感觉起来有点乱,把图放一起就有了整体架构。
处理器指令集架构(ISA)
ISA指定了计算机可以执行的指令及其格式。ISA本质上是软件和硬件之间的接口。
大多数ISA包含的指令有:处理数据的指令、移动数据的指令和控制程序执行顺序的指令。
以MARIE举例,
“可以执行的指令的格式”:16位的指令,高4位是操作码,低12位是地址:
“可执行指令的样子”:
可以发现:
- 处理数据的指令:Add Subt Input Output
- 移动数据的指令:Load Store
- 控制程序执行顺序的指令:Skipcond Jump
寄存器传输表示(RTN)
Load指令将内容加载到存储器,但是要观察在部件级发生了什么,可以发现一系列微操作——微指令。
微指令规定了对寄存器中存储的数据执行的基本操作
描述微操作行为的符号表示法称为——寄存器传输表示法(RTN),或寄存器传输语言(RTL)
用RTN表示程序执行过程是本章重点
汇编语言与编译程序
了解怎样利用汇编语言编程有助于很好地理解计算机的体系结构
指令集的扩展
刚刚列出的MARIE的指令集足以编写任何所需的程序,但我们可以再增加几条指令使MARIE的编程任务更加简单
使用:ADDI,JumpI,LoadI,StoreI引入了不同的寻址模型:直接寻址和间接寻址
硬连线和微程序控制
MARIE执行add指令时,控制信号将ALU设置为加法运算,并将结果放到AC中。
ALU具有不同的控制线,它们可以决定执行哪一种操作——这些控制线实际上是如何被选中的?
- 硬连线控制
物理上将各条控制线与实际的机器指令连接。一般来说,指令被分成不同的字段,字段中不同的位连线接到输入线,来驱动不同的数字逻辑不见。 - 微程序控制
使用由微指令组成的软件,它们执行指令的微操作。
机器执行
这里虽然不是考点,但是打通了对“第0层:数字逻辑,第1层:控制,第2层:机器”的认识。
结合之前学过的数字电路逻辑,想明白一条计算机指令是如何通过高电平,低电平……实现的。
这里把前边的那几张图拼起来,做一个本章的小结:
所以说:
Q:为什么计算机需要时钟周期?
A:因为计算机需要循环计数器来产生控制信号,而计数器需要时钟信号输入。
Q:为什么计算机需要循环计数器来产生控制信号?
A:执行一条指令需要让寄存器等按顺序执行一系列操作,而这个固定的顺序需要基于一个不断重复的时钟周期序列,且序列的每个信号都不同。
这也解释了:不同信号的数量由最大微操作数量确定。
这也解释了:一个微处理器每秒能够执行的指令数与它的时钟速度成正比例关系。
这也解释了:计算机的运行速度与微处理器的脉冲频率(时钟周期)直接相关,处理器的额定频率是整个系统速度的关键。
如本书一开篇提出的:软件与硬件等价原理
硬连接做到的事用微程序也做到了,但是两者在性能,扩展性,成本上各有优劣,学习计组也是在学习如何在其中TradeOff。
CISC和RISC是处理器指令集架构的两种主要设计思想
CISC的具体实现:x86架构,RISC-V, IBM System/360 和 System/370……
- x86架构:Intel和AMD是x86架构处理器市场的主导者。
RISC的具体实现:ARM架构,MIPS架构……
- ARM架构:它以低功耗、高性能和高能效比著称,广泛应用于移动设备、嵌入式系统和物联网设备。随着苹果M系列芯片的成功,ARM架构在PC市场的份额逐渐增加。
▶ARM架构的起源
ARM架构的起源可以追溯到20世纪80年代初,由英国的Acorn Computers公司开发。当时,Acorn Computers的工程师团队,包括Steve Furber和Sophie Wilson,基于加州大学伯克利分校的RISC(精简指令集计算机)研究成果,设计出了第一款ARM处理器——ARM1。这款处理器于1985年推出,是世界上首款商业化的RISC处理器之一。
1990年,Acorn Computers与苹果公司(Apple)和VLSI Technology共同投资成立了Advanced RISC Machines Ltd.(ARM公司),专注于ARM架构的进一步开发和推广。ARM公司采用IP授权模式,允许其他半导体公司使用其架构设计芯片,这种模式为ARM架构的广泛应用奠定了基础。
ARM架构因其高效能、低功耗和灵活可扩展的特点,逐渐在移动设备、嵌入式系统和物联网领域占据主导地位。
- MIPS架构:
指令简单且长度固定,采用流水线技术提高执行效率,硬件设计简洁。
要用于嵌入式系统、网络设备和个人娱乐装置等,以低功耗、高性能和良好的扩展性著称。
龙芯等厂商通过获得MIPS架构授权,开发了自主可控的处理器,并逐步形成了自己的指令集架构(如LoongArch),以提高自主性和安全性。
我们学院学长们留下的操作系统:LoOS就是基于龙芯的指令集架构开发的。
RISC-V与x86架构的对比
- 开放性:
RISC-V:完全开源,任何人都可以免费使用、修改和分发。
x86:由英特尔和AMD主导,技术授权严格,需要支付授权费用。 - 灵活性:
RISC-V:指令集简洁,可扩展性强,可以根据不同应用场景进行定制。
x86:指令集复杂,扩展性较差,定制化难度较高。 - 应用场景:
RISC-V:广泛应用于物联网、嵌入式系统、人工智能、高性能计算等领域。
x86:主要用于个人电脑、服务器和数据中心,以高性能和强大的计算能力著称。
RISC-V的应用领域 - 物联网:RISC-V芯片满足低功耗、低成本、小尺寸需求,适用于智能家居设备、可穿戴设备等。
- 边缘计算:在本地快速处理数据,减少云端传输,适用于智能安防摄像头、车载系统等。
- 人工智能:RISC-V可以通过定制化优化AI计算需求,例如阿里巴巴达摩院研发的AI专用RISC-V处理器C908X。
- 高性能计算:RISC-V正在向高性能计算领域拓展,例如玄铁C930处理器已用于服务器和自动驾驶汽车。
RISC-V的未来发展
预计到2030年,RISC-V处理器的出货量将达到170亿颗,占据全球市场近25%的份额。
RISC-V有望在高性能计算、人工智能和物联网等领域与x86和ARM架构形成三分天下的局面。
RISC-V的开放性和灵活性使其成为全球科技产业的重要一环,特别是在中国,RISC-V被视为芯片自主可控的重要突破口。
- 早期CISC设计:在x86架构的早期阶段(如8086、80286),它完全符合CISC架构的特点,指令集复杂且硬件实现复杂。
- 微操作和解码:随着技术的发展,x86架构逐渐引入了微操作(microcode)来简化复杂指令的执行。微操作是一种低级的指令,用于将复杂的CISC指令分解为多个简单的操作。
- 现代x86处理器的优化:现代x86处理器(如英特尔的酷睿系列和AMD的锐龙系列)虽然仍然保留了CISC架构的指令集,但在内部实现上采用了RISC(精简指令集计算机)的设计思想。例如,复杂的x86指令在内部被转换为多个简单的微操作,这些微操作在硬件上以类似RISC的方式执行。
- 混合架构:现代x86处理器可以被视为一种混合架构,它在外部保持CISC指令集的兼容性,而在内部则采用了RISC的设计理念来提高性能和效率。
NachOS和MIPS之间的关系主要体现在以下几个方面:
MIPS模拟器
NachOS包含一个MIPS指令集的模拟器,用于模拟MIPS架构的处理器。这个模拟器允许用户级程序在NachOS环境中运行,而无需依赖真实的MIPS硬件。用户程序被加载到模拟器的内存中,模拟器初始化寄存器后开始执行。
用户程序与内核模式
NachOS有两种执行模式:
- 用户模式:用户程序在MIPS模拟器中运行,只能访问与模拟机器相关联的内存。
- 内核模式:当用户程序执行导致硬件陷阱(如非法指令、页面错误、系统调用等)时,NachOS切换到内核模式,执行内核代码。
系统调用与参数传递
在基于MIPS架构的NachOS中,系统调用的参数传递通常通过寄存器完成。例如,Exec()
系统调用的参数FileName
需要从用户地址空间传递到内核中,通常会将参数依次保存到寄存器$4-$7
中。
跨平台支持
尽管NachOS最初是为MIPS架构设计的,但它也支持其他平台(如SPARC、PA-RISC、x86等)。不过,用户程序仍然需要编译为MIPS指令集的代码,以便在NachOS的MIPS模拟器中运行。
教学用途
NachOS是一个教学级操作系统,主要用于操作系统课程的教学实验。通过使用MIPS模拟器,学生可以在不依赖真实硬件的情况下,学习和实验操作系统的基本原理。
总结来说,MIPS架构在NachOS中主要通过模拟器实现,用于运行用户程序并支持系统调用的执行,是NachOS教学和实验环境的重要组成部分。
[More Information]
MARIE体系结构总结与对比
CISC与RISC:Intel和MIPS体系结构
MIPS编程