开个新系列记录计组学习的知识点。
主要参考教材:网课南京大学袁春风老师的MOOC,书籍《深入理解计算机系统》
袁春风老师的MOOC在b站有完整版:https://www.bilibili.com/video/av69563153?from=search&seid=18216428773595388164
1.计算机系统的抽象层次
首先给出一张计算机系统的抽象层次。最终用户处在最上端,是使用者,也是问题的直接提出者。ISA指令集体系结构是软件和硬件的交界层。
计算机越向上层走越抽象,越向下层走越具体。记住一句话:上层是对下层的抽象,使用下层,底层是对上层的实现,为上层提供支撑环境。
2.冯诺依曼体系结构
最早的计算机是上世纪40年代,美国出于军事目的(计算导弹的轨道)设计出来的。其中,冯诺依曼设计的计算机体系成为经典的计算机体系一直沿用至今。
冯诺依曼结构的关键是存储程序。
设计的理念是,程序应该事先被存储起来,想要做某项计算工作时,只要输入数据,就会自动调用程序,程序自动一步步完成计算,最后输出结果。
所谓程序就是指令的集合。
按照上面的理念,存储程序就需要存储器,输入输出程序就需要输入输出的设备(I/O设备),完成自动化的过程需要控制器,完成计算的过程需要运算器。即如下:
上图是高度的抽象,稍微具体一点设计如下图:
运算器会以算数逻辑电路为基础构成,存储器可以分为主存储器(主存)和许多寄存器,程序计数器(Program Counter)顺序调用程序。为了区分各项数据和程序,它们都会标有自己的地址存放在数据寄存器中,控制电路会输出控制信号来完成自动化的操作。
3.现代计算机体系结构
现代计算机的结构模型基于冯诺依曼体系,变化不大:
控制器、程序计数器PC、数据和地址寄存器(MAR和MDR)、通用寄存器组(GPRs)、算数逻辑单元(ALU)、标志寄存器构成了CPU(中央处理单元)。
上世纪早期的计算机设计中,各组件是分散设计的,而现代计算机使用了总线技术设计,地址、数据和控制信号通过三条总线传输,分别为地址总线、控制总线和数据总线。
输入输出设备很好理解,键盘和鼠标就是典型输入设备,显示屏就是输出设备。
CSAPP给出的图:
程序存放在磁盘上。对外的设备都会有其配套的控制器或适配器,控制器是IO设备本身或者计算机的主印刷电路板(主板)上的芯片组,适配器就是主板上的插槽上的卡,作用都是传输数据到IO总线。
上面说的主存实际就是通常说的“内存”,会以内存条的形式插在电脑主机里面。主存是临时存储设备,用动态随机存储器(DRAM)芯片组成。主存中会存放需要执行的机器指令。
CPU就是通常说的“处理器”,是解释和执行指令的引擎,核心是程序计数器PC。从上电到下电为止,PC都会不断更新,指向某条指令的地址。
4.存储器层次结构
CPU直接从磁盘中读数据,比从主存中读慢好几个数量级,而直接从主存中读数据,又比从寄存器中读慢上几乎两个数量级。
所以现代存储的理念是,一步步从下往上读数据,正在运行的程序会通过主存(即内存)存数据,并发展出了高速缓存存储器(Cache)技术。
访问Cache的速度比访问内存快很多,Cache会存放可能经常访问的数据。
一个典型的存储器层次结构:
上层会保存来自下层的数据,越往上访问速度越快。
5.指令的执行过程
如PPT,袁老师拿做菜比喻。
指令简单说,包括操作数和操作码(及地址),操作数是要处理的数据,操作码描述了怎么处理。指令会以0和1的二进制字段来表示。
6.一个程序的生成过程
以Linux环境下用gcc编译器为例,假如写了个程序叫hello.c,打印“Hello”。
首先,想要执行编译的过程,本身就会调用系统的一个程序,叫编译驱动程序,也叫Unix Shell。也就是平时看到的那个命令行窗口。
输入
gcc -o hello hello.c
就会编译当前所在目录下的名为hello.c的程序,然后最后生成名为“hello.o”的可执行文件。
编译过程如下:
hello.c就是个用ASCII字符表示的文本文件。预处理器会根据 # 后面跟的代码执行一些操作(比如包含头文件等),然后生成修改后的文本文件,再经过编译器生成机器级语言(汇编)表示的文本文件,该文本文件再通过会汇编器翻译成机器可以理解的二进制文件。因为hello调用了printf函数来自另一个程序,所以另一个程序也会经过相同的编译过程,最后链接到一起,生成可执行文件。
7.程序开发需要的支撑环境
现在的IDE也就是所谓的语言处理程序,把中间的编辑器和一套翻译转换程序都集成好了,比如Virtual Studio,CodeBlock,Pycharm这样的。
操作系统简单来说就是个大软件,是对下层硬件的抽象,为操作硬件提供许多的基本指令。
来源:https://www.cnblogs.com/banmei-brandy/p/12264898.html