《计算机系统基础》第一章——计算机系统概述(笔记)

1.1计算机的发展历程

1.1.1 电子计算机的诞生

  1. 世界第一台电子计算机是1946年在美国诞生的ENIAC
  2. 其设计师是:美国宾夕法尼亚的大学的:Mauchly和Eckert

1.1.2 第一代计算机

  1. 第一代的计算机(20世纪40年代-50年代)为电子管计算机
  2. 其逻辑元件采用电子管,存储器件为声延迟线或磁鼓
  3. 典型逻辑结果为定点运算,编制程序所用工具为低级语言
  4. 1945年,冯 诺依曼的小组,发表了“存储程序”(stored-program)方式的电子数字计算机方案EDVAC,宣告了现代计算机结构思想的诞生
  5. “存储程序”方式的基本思想是“必须将实现编好的程序和原始数据送入主存后才能执行程序
  6. 冯 诺依曼,于1946年开始涉及“存储程序”计算机,该机被称为:IAS计算机

1.1.3 第二代计算机

  1. 第二代计算机(20世纪50中后期-60年代)为晶体计算机
  2. 1947年,美国贝尔实验室的三位科学家发明了晶体管,为计算机的发展提供了新的技术基础
  3. 这一代的计算机除了逻辑元件采用晶体管除外,其内存采用了磁芯存储器,外存采用磁鼓与磁带存储器,实现了浮点运算
  4. 在系统结构方面提出了变址,中断I/O处理器等新概念
  5. 这时计算机软件得到了发展,出现了多种高级语言及其编译程序

1.1.4 第三代计算机

  1. 第三代计算机(20世纪60年代中到20世纪70年代中后期)为集成电路计算机
  2. 使得计算机的逻辑元件与存储器均可由集成电路实现

1.1.5 第四代计算机

  1. 第四代计算机(20世纪70年代后期开始)为超大规模集成电路计算机
  2. 微电子学飞速发展而产生的大规模集成电路和微处理器给计算机工业注入了新鲜血液

总结

  • 计算机技术的另外一个重要发展方向是计算机的智能化,其着眼点是发展以知识为基础的智能化处理能力,用以模拟或部分替代人的智能活动,并提供智能化的人机交互接口,使计算机具有自然的人机通信能力。普适化,智能化,嵌入式和网络化是未来计算机发展的主要方向

1.2 计算机系统的基本功能和基本组成

前言

  1. 计算机是一种能自动对数字化信息进行算术和逻辑运算的高速处理装置
  2. 计算机处理的对象是数字化信息,处理的手段是算术和逻辑运算,处理的方式是自动的

1.2.1 计算机系统的基本功能

  1. 数据处理是计算机系统最基本的功能,可以进行加减乘除等基本算术运算和与或非等逻辑运算

  2. 数据存储功能是计算机能采用自动工作方式的基本保证;计算机中提供的存储器使得程序和数据能事先被存储,并在需要时指令被取出自动执行

    2.1 能够长期保存信息的像磁盘存储器那样的非易失性存储器

    2.2 正在执行的程序和处理的数据需要存放在快速存储器中,因此有半导体元器件构成的随机访问存储器等

  3. 数据传送功能是指计算机内部的各个功能部件之间,计算机主机与外部设备之间,各个计算机系统之间进行信息交换的操作功能;例如数据处理的部件需要从存储部件中读取数据或写入数据

  4. 通常把进行数据处理的部件称为运算部件或运算器,主要的运算部件是算术逻辑部件(Arithmetic Logical Unit,简称ALU)

  5. 进行数据存储的部件称为存储部件或存储器,主要分为外存和内存

  6. 进行数据传送的部件称为互连部件,主要有总线,桥接器

  7. 计算机系统由硬件和软件两部分组成;

​ 硬件(hardware):是物理装置的总称,有:芯片,板卡,外设,电缆

​ 软件(software):包括运行在硬件上的程序和数据及其文档

​ 程序(program):是指挥计算机如何操作的一个指令序列

​ 数据(data):是指令操作的对象

1.2.2 计算机硬件

  1. 绝大部分的计算机硬件基本组成仍然具有冯诺依曼结构计算机的特征

    (1):采用“存储程序”工作方式

    (2):计算机由运算器,控制器,存储器,输入设备和输出设备五个基本设备组成

    (3):存储器不仅能存放数据,而且也能存放指令,形式上数据和指令没有区别

    (4):计算机内部以二进制形式表示指令和数据;每条指令由操作码和地址码两部分组成,操作码指出操作类型,地址码指出操作数的地址;由一串指令组成程序

  2. 中央处理器(Central Processing Unit,简称CPU),是整个计算机的核心部件,主要用于指令的执行;CPU主要包含两个基础部分:数据通路和控制器

    (1) 数据通路(datapath) 主要是用来执行基本的算术和逻辑运算以及寄存器和存储器的读/写控制等,其中算术逻辑部件(ALU) 用来进行基本的算术和逻辑运算,ALU 中最基本的部件是 加法器,所有算术运算都可以基于加法运算和逻辑运算来实现

    (2) 控制器(controller) 用来对指令进行译码,生成相应的控制信号,以控制数据通路进行正确的操作

  3. 存储器分为内存和外存;

    (1)内存包括主存储器(main memory,简称 主存)和高速缓冲存储器(cache)

    (2)外存包括辅助存储器和海量后备存储器;通常把系统运行时直接和主存交换信息的存储器称为富足存储器,简称(辅存),目前主要的辅助存储器时磁盘存储器和固态硬盘;而磁带存储器和光盘存储器的容量大,速度慢,主要用于信息的备份和脱机存档,因此它们被用作海量后备存储

  4. 外部设备简称外设,也称为I/O设备(Input/Output),外设通常由机械部分和电子部分组成,并且两部分通常时可以分开的;

    (1)机械部分是外部设备本身,而电子部分则是控制外部设备工作的I/O控制器

    (2)外设通过I/O控制器 连接到主机上,I/O控制器或I/O适配器统称为 设备控制器

    (3)例如:键盘接口,打印机适配器,显示控制卡(显卡),网络控制卡(网卡)都是一种设备控制器,属于一种I/O模块

  5. 总线(bus) 数据传送时传输信息的介质,用于在部件之间传输信息,CPU,主存和I/O模块通过总线互连,在CPU和I/O模块中都内含相应的存储部件,即缓存器

  • 一个典型的计算机系统的硬件组成

    1. CPU中包含控制器,算术逻辑部件ALU,寄存器堆(register file,也称通用寄存器组或寄存器文件),总线接口部件等
    2. CPU,主存储器和I/O模块之间通过总线交换信息,I/O总线用来传输与设备控制器交换的信息,不同总线之间通过I/O桥接器(I/O bridge) 相连接
    3. CPU通过处理器总线,I/O桥接器等与主存储器和I/O模块交换信息;
    4. 主存储器通过存储器总线,I/O桥接器与CPU和I/O模块交换信息
    5. I/O设备通过各自的设备控制器或适配器连到I/O总线上

    书上有具体的流程图片

1.2.3 计算机软件

  1. 系统软件(system software) 包括为有效,安全地使用和管理计算机以及为开发和运行应用软件而提供地各种软件,介于计算机硬件与应用程序之间

(1)操作系统(Operating Systems,简称OS),主要用来管理整个计算机系统的资源,包括对它们进行调度,管理监视和服务,操作系统还提供计算机用户和硬件之间的人机交互界面,并提供对应用软件的支持

(2)语言处理系统主要用于提供一个用高级语言编程的环境,包括源程序编辑,翻译,调试,链接,装入运行等功能

  1. 应用程序(application software)指专门为数据处理,科学计算,事务管理,多媒体处理,工程设计以及过程控制等应用所编写的各类程序;例如:游戏软件

1.3 程序开发与执行过程

前言

  1. 程序的开发和执行计算机系统的各个不同层面
  2. 程序被称为用户程序(user program)或应用程序(application program)

1.3.1 从源程序到可执行程序

以下是hello.c的C语言 源程序代码

#include<stdio.h>

int main()

{

printf("hello world!\n");

}

  1. 通过程序编辑软件得到hello.c文件,如第一个字节的值是35,代表字符’#';通常用ASCII码字符或汉字字符表示的文件称为文本文件(text file),源程序文件都是文本文件,是可显示和可读的

  2. 将hello.c进行 预处理,编译,汇编和链接,最终生成可执行目标文件;在UNIX系统中,可用GCC编译驱动程序进行处理,命令如下:

    unix> gcc -o hello hello.c

    gcc为GCC编译驱动程序名,-o表示后面为输出文件名,hello.c为要处理的源程序

    hello.c源程序文件到可执行文件的转换过程

    1. 预处理阶段:预处理程序(cpp)对源程序中以字符#开头的命令进行处理;例如:将#include命令后面的.h文件内容嵌入放到源程序中(#define #endif);预处理程序的输出结果还是一个源程序文件,以.i为扩展名
    2. 编译阶段:编译程序(ccl) 对预处理后的源程序进行编译,生成一个汇编语言程序文件以.s为扩展名;例如:hello.s是一个汇编语言程序文件;因为汇编语言与具体的机器结构有关,所以,对于同一台机器来说,不管使用上面高级语言,编译转换过后的输出结果使用都是同一种机器级代码
    3. 汇编阶段:汇编程序(as) 对汇编语言源程序进行汇编,生成一个可重定位目标文件(relocatable object file),以.o为扩展名,例如:hello.o是一个可重定位目标文件;它是一种二进制文件(binary file),因为其中的代码已经是机器指令,数据以及其他信息也都是二进制表示的,所以它是不可读的,也即显示出来的是乱码
    4. 链接阶段:链接程序(ld) 将多个可重定位目标文件和标准库函数合并成为一个可执行目标文件(executable object file),可执行目标文件可简称为:可执行文件,本例中:链接程序将hello.o和标准库printf所在的可重定位目标模块printf.o进行合并,生成可执行文件hello
    5. 最终生成的可执行文件被保存在磁盘上,可以通过某种方式启动一个磁盘上的可执行文件运行

1.3.2 可执行文件的启动与执行

  • Windows双击对应图标;Linux | Unix 在命令行中输入可执行文件名等多种方式启动执行

  • 启动和执行hello程序的整个过程

  1. shell程序会将用户从键盘输入的每个字符逐一读入CPU寄存器中,然后再保存到主存储器中,在主存的缓冲区形成字符串"./hello"
  2. 等到接到[Enter]按键时;shell将调出的操作系统内核中相应的服务例程,由内核来加载磁盘上的可执行文件hello到存储器
  3. 内核加载完可执行文件中的代码机器所要处理的数据(这里时字符串"hello world!\n")后,将hello第一条指令的地址送到程序计数器(Program Counter,简称PC)
  4. CPU永远都是将PC的内容作为将要执行的指令的地址,因此处理器随后开始执行hello程序,它将加载到主存的字符串"hello world!\n"中的每一个字符从主存取到CPU的寄存器中,然后将CPU寄存器中的字符送到显示器上显示出来

————————————————————————————————————————————————————————————————————————————————————

  1. 从上述过程中可以看出,一个用户程序被启动执行,必须依靠操作系统的支持,包括外壳程序和内核服务例程;
  2. 例如shell命令行解释器时操作系统外壳程序,它为用户提供了一个启动程序执行的环境,对用户从键盘输入的命令进行解释,并调出操作系统内核来加载用户程序(用户输入命令对应的程序)
  3. 用来加载用户程序并使其从第一条指令开始执行的操作系统内核服务例程也是必不可少的
  4. 在上述过程中,设计键盘,磁盘和显示器等外部设施例程的支持;例如:用户程序需要调用内核的read系统服务历程读取磁盘文件,或调用内核的write系统调用服务把字符串写道显示器中等

总结:

  • 程序的执行过程就是数据在CPU,主存储器和I/O模块之间流动的过程
  • 所有数据的流动都是通过总线,I/O桥接器等进行的
  • 数据在总线上传输之前,需要先缓存在存储部件中,因此,除了主存储器本身是存储部件以外
  • 在CPU,I/O桥接器,设备控制器中也有存放数据的缓冲存储部件
  • 例如:CPU中的寄存器堆,设备控制器中的数据缓冲寄存器

1.3.3 程序中每条指令的执行

  1. 每个可执行目标文件中都包含程序代码段,可执行文件的执行实际上是对应的程序代码段执行的过程

  2. 程序代码由一条一条机器指令构成

  3. 指令(instruction)是用0和1表示的一串0/1序列,用来指示CPU完成一个特定的原子操作:

    (1):**取数指令(load instruction)**从存储单元中取出一个数据存放到CPU寄存器中

    (2):**存数指令(store instruction)**将CPU寄存器的内容写入一个存储单元

    (3):**ALU指令(ALU instruction)**将两个寄存器内容惊醒某种算术或逻辑运算后再送入一个CPU寄存器中

    (4):输出指令(output instruction),将一个CPU寄存器的内容送到I/O模块的某个缓存器中

  4. 在上述hello程序中,字符串"hello world!\n"中的每一个字符都要通过取数指令从存储器送到CPU寄存器中,然后,再通过输出指令从CPU寄存器送到显示器适配器(也称显示控制器)中

————————————————————————————————————————————————————————————————————————————————————

  1. 指令通常被划分为若干字段,由操作码字段,地址码字段和立即数字段等

    (1)操作码字段:指出指令的操作类型,如加,减,传送,跳转等

    (2)地址码字段:指出指令所处理的操作数的地址,如寄存器编号,内存单元地址等

    (3)立即数字段:指出具体的一个操作数或偏移量

  2. 《计算机系统基础》p14 图1.9中:给出了实现两个相邻数组元素交换功能的不同层次语言的描述

  3. 在高级语言源程序中,可直观地用三个赋值语句实现

    temp=v[k];

    v[k]=v[k+1];

    v[k+1]=temp;

  4. 在经编译后生成的汇编语言源程序中,可用4个汇编指令表示,其中两条是取数指令lw(load word)

    另两条是存数指令sw(store word)

    编译后的程序后的结果:

    lw $15,0($2)

    lw $16,4($2)

    sw $16,0($2)

    sw $15,4($2)

  5. 在经汇编后生成的机器语言程序中,对应的机器指令是特定格式的二进制代码;

    例如:第一条lw指令对应机器代码为"1000 1100 0100 1111 0000 0000 0000 0000"

    这是一条MIPS(指令集架构)体系结构中的指令,其中,【高6位 “100011”位操作码,随后5位"00010"为寄存器编号2,再后面5位"01111"为另一个寄存器编号,最后16位表示立即数0】

  6. CPU能够通过逻辑电路直接执行这种二进制表示的机器指令;指令执行时通过控制器堆指令操作码进行译码,解释成控制信号(control signal)控制数据通路执行

    例如:

    控制信号ALUop=add可以控制ALU进行加法操作,RegWr可以控制将结果写入寄存器中

    ……,EXTop=1,ALUSelA=1,ALUSelB=ll……………………

—————————————————————————————————————————————————————————————————————————————————————

  1. 每条指令的执行过程包括:从存储器取指令并计算下一条指令的地址,对指令进行译码,取操作数,对操作数运算,送运算结果到存储器或寄存器保存
  2. 每次从存储器取指令都是将PC的值作为指令的地址,因此,计算处的下条要执行指令的地址被送到PC,当前指令执行完后,根据PC的值到存储器去取下条指令,从而能够周而复始地执行程序中地每条指令
  3. 指令地执行由时钟信号(clock signal)进行定时,一条指令的执行可能需要一个或多个时钟的时间

版权声明:本文为lihua777原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
THE END
< <上一篇
下一篇>>