计算机系统核心概念及软硬件实现

2024-08-14 2024-08-19 Mon 08:21

Table of Contents

1. App7 层(应用层)

论述一些软件的使用,可以跳过

2. HOL6 层(高级语言层)

以 C++为例子论述高级语言的一些性质,具体的

2.1. 变量

  • 论述了 C++编译器执行的基本功能
  • C++的内存模型
  • 全局变量和赋值语句

2.2. 控制流

2.3. 函数

2.4. 递归

2.5. 动态内存分配

3. ISA3 层(指令集架构层)

3.1. 信息的表示

描述了计算机中数据是如何保存的以及数据之间是如何进行运算的.计算机如何表示浮点数这部分内容很不错.

3.2. 计算机体系结构

3.2.1. 4.1 和 4.2

主要表述 pep8 的体系结构,比较详细,看的时候只要把握大概就好了.在做习题的时候会加深理解的.

3.2.2. 4.3 冯诺伊曼机器

讲述了冯诺伊曼机器的执行步骤,具体如下: 加载机器语言程序 初始化 PC 和 SP do{ 取下一条指令 指令指示符解码 递增 PC 执行取出的指令 } while (没有执行停止指令)

3.2.3. 4.4 ISA3 层编程

描述了怎么样使用机器码给 pep8 编程 可以跳过,之后在 Asmb5 层进行编程

4. Asmb5 层(汇编层)

4.1. 汇编语言

汇编层即是对 ISA3 层次的抽象.隐藏了 ISA3 层的细节. 汇编语言的语句可以分成两种类型助记符语句(指令),伪操作(即点命令,汇编器指示字,数据) 汇编语言消除了程序中需要手工确定数据和指令地址的问题(这个是最痛苦的) 高级语言层的变量对应与汇编层的内存地址, 在汇编层唯一的类型是位,某种意义上算是完全的动态类型

4.2. 编译到汇编层

主要讲解 C++和汇编语言之间的关系,C++的语句如何在汇编层实现

4.2.1. 栈寻址和局部变量

讲述了汇编层如何进行栈寻址的,以及数据出栈入栈的操作 要翻译程序的局部变量,编译器要:

  • 用 SUBSP 分配内存
  • 用栈相对寻址访问局部变量
  • 用 ADDSP 释放存储

4.2.2. 转移指令和控制流

讲述了 pep8 的 8 个条件分支指令,每个条件分支检测 4 个状态位 N,Z,V,C 中的一个或者两个. 之后描述了如何用这个 8 个分支指令来实现 C++的 if 语句,if/else 语句,while 循环,do 循环,for 循环

4.2.3. 函数调用和参数

C++层面的函数调用如何在汇编层面完成

  • 无参空函数的调用 以无参空函数为例子讲解了汇编层面的 CALL 指令和 RETn 指令如何配合完成函数调用的.
  • 全局变量翻译传值调用参数 具体步骤如下:
    1. 调用压入实参(执行 SUBSP)
    2. 调用压入返回地址(执行 CALL)
    3. 被调用分配局部变量(执行 SUBSP)
    4. 被调用执行它的函数体
    5. 被调用释放局部变量,弹出返回地址(执行 RETn)
    6. 调用弹出实参(执行 ADDSP)
  • 用局部变量翻译传值调用参数 和全局变量不同的地方在于使用栈相对寻址的
  • 翻译非空函数调用 较前两个多了压入返回值的存储空间和释放返回值储存空间这一步.
  • 用全局变量翻译传引用调用参数 和传值调用最大的不同在于,传引用调用会把实参的地址压入栈中,然后通过栈相对间接寻址找到操作数
  • 用局部变量翻译传引用调用参数 通过把栈指针的值与局部变量的栈相对值相加,得到局部变量的绝对地址,然后同全局变量翻译
  • 翻译布尔类型 C++直到 1996 年都没有 bool 类型

4.2.4. 变址寻址和数组

  • 作为全局变量的数组 使用.BLOCK n 给数组分配储存空间,n 是数组占用的总字节数 通过把索引乘以每个单元的字节数装入变址寄存器来访问数组元素,使用变址寻址
  • 作为局部变量的数组 使用 SUBSP 对数组进行分配,用 ADDSP 释放 通过把索引装入变址寄存器来访问数组元素,把索引乘以每个单元的字节数,使用栈变址寻址
  • 作为参数传递的数组 考虑到效率,C++中对于数组默认是传引用调用 数组第一个元素的地址压入运行时栈,对于局部数组,使用 MOVSPA 后面采用立即数寻址的 ADDA, 对于全局数组,使用立即数寻址的 LDA 通过把索引装入变址寄存器来访问数组元素,将索引乘以每个单元的字节数,使用栈变址间接寻址
  • 翻译 switch 语句 编译器生成转移表,然后使用变址寻址的方式进行寻址

4.2.5. 动态内存分配

讲述编译器怎样翻译指针和结构(struct)

  • 翻译全局指针 用.BLOCK 2 给指针分配储存空间,因为一个地址占用 2 字节 在 heap 中分配指针指向的单元 用直接寻址访问指针 用间接寻址访问指针指向的单元
  • 翻译局部指针 使用 SUBSP 在运行时栈给指针分配储存空间,用 ADDSP 释放储存空间 用栈相对寻址访问指针 用栈相对间接寻址访问指针指向的单元
  • 翻译结构 在 Asmb5 层结构非常像数组,结构的字段名对应该字段距离结构第一个字节的偏移量. 结构的每个字段等于它距离结构第一个字节的偏移量 用.BLOCK n 给结构分配储存空间,n 是结构占用的总字节数 用立即数寻址把字段的偏移量装入变址寄存器,后面跟一条使用变址寻址方式的指令来访问结构的字段.
  • 翻译链式数据结构 结点的字段名等于字段距离节点第一个字节的偏移量,把偏移量装入变址寄存器 访问结点字段的指令使用栈变址间接寻址的

4.3. 语言翻译原理

计算机科学的基本问题,什么能够被自动化,人工语言的自动化翻译是计算机科学的核心. 语言翻译可以分成词法分析,语法分析和代码生成三个步骤 计算机语言的语法是一个程序要成为合法的语言程序必须要遵守的一套规则.语法包含 4 个人部分:

  • N, 一个非终结字符表
  • T, 一个终结字符表
  • P, 一套产生式规则
  • S, 初始符, 为 N 的一个元素

词法分析即是把一串终结字符,转换为非终结字符 语法分析即是根据产生式规则校验词法分析产生的非终结字符

5. OS4 层(操作系统层)

操作系统的目的是向高级语言提供一个更加方便的环境,并且有效分配系统资源(CPU 时间,主存,磁盘存储器)

5.1. 进程管理

5.1.1. 装载器

操作系统必须把适当的程序装载到主存并把 CPU 的控制交给这个程序来执行

5.1.2. 陷阱

某些在 ISA3 层没有的指令,当计算机取出具有这样一些操作码的指令时,会触发陷阱,调用操作系统提供的接口,来进行操作

5.1.3. 并发进程

中断分为两种

  • 同步中断 每次执行进程中断时是同时发生的,中断和代码是同步的.
  • 异步中断 执行时发生的时间不可预测,常见的原因是超时,I/O 完成
    • 超时 分时系统只会让进程运行一定的时间间隔,之后中断运行下一个进程
    • I/O 完成 当进程请求 I/O 操作时,会触发中断,运行下一个进程,I/O 操作完成时,中断第二个进程,继续执行第一个进程

5.1.4. 并发处理程序

由于 HOL6 的赋值操作不是原子性的,进程间共享内存会导致出现预期以外的行为,所以需要设置临界区 critical section 即进程在执行该区域时,其他进程不能访问 临界区需要两段额外的代码段, 入口段和出口段.

  • 入口段 测试其他进程是否在执行临界区
  • 出口段 通知其他进程,该进程已经出了临界区

5.2. 储存管理

操作系统如何分配储存空间的

5.2.1. 内存管理

  1. 单通道程序设计 uniprogramming

    最简单的内存分配技术,操作系统在内存的一段,应用程序在另一端,系统一次只执行一个作业,每个作业都加载在同一位置

  2. 优点

    设计简单,系统小,适用于嵌入式系统

  3. 缺点

    CPU 利用率低,作业调度不灵活

  4. 固定分区多通道程序设计 fixed-partition multiprogramming

    对单通道的改进,把主存分成了不同的分区,分别储存不同的正在执行的进程.分区的大小不会改变

  5. 缺点

    分区不灵活,浪费了内存空间,对更高的层级暴露了过多的细节

  6. 可变分区多通道程序设计 variable-partition multiprogramming

    对固定分区的改进,操作系统只在作业加载进内存时才设立分区,且分区的大小正好适合作业的大小

  7. 缺点

    由于分配的算法,会出现小的内存片段,因为过于小,导致难以分配作业,即使可以通过合并回收内存,仍然是个很耗时的操作

  8. 分页 paging

    对可变分区的改进,把程序分解开,是去适合洞.

  9. 缺点

    需要维护一个页表每次引用内存都需要先访问页表,比较耗时.

  10. 虚拟内存 virtual memory

    对分页的改进,不是一次性把所有页加载进内存,而是有选择的加载页

  11. 缺点

    引发缺页时必须从磁盘中加载缺页,耗时较长

5.2.2. 文件管理

操作系统负责维护磁盘上的文件,连接起 HOL6 或 Asmb5 层程序员看到的文件的逻辑组织和文件在磁盘上的无力组织 存储分配技术

  • 连续 操作系统使文件的无力组织与逻辑组织相匹配,把文件连续地放在一个磁道相邻的块中
  • 链接 把文件储存在物理上分散在磁盘上的块中,每个块的最后几个字节保留给下一块的地址
  • 索引 把一个文件所有的块都放进一个列表中

6. LG1 层(逻辑门层)

LG1 层是一切的基础,因为考虑到成本的因素,所以会加入 Mc2 层来减少开发成本,但是这样速度就会变慢. LG1 层的电路有两种基本的结构,组合电路和时序电路. 组合电路即只由输入决定输出的电路,时序电路即输入确定,但是输出却可能随时间变化的电路

6.1. 组合电路

描述组合电路的行为有三种方式:

真值表
列出输入值每种可能组合的输出
布尔代数表达式
说明组合电路是怎么做的 布尔代数表达式,具体可以看离散数学
逻辑图
即把电路图话出来,最接近电路的一种

解布尔表达式卡诺图做电路优化的细节,略过 计算机设计当中普遍用到的一些电路单元,略过

6.2. 时序电路

相比组合电路来说是有状态的电路 时序电路也是由和组合电路一样的逻辑门组成,但是时序电路相对于组合电路来说是有反馈电路的,因为反馈电路,时序电路才有了状态 时序电路的行为通过时序图来给出图形化表示 计算机会维护一个时钟,所有设备必须根据时钟同时改变状态.

7. Mc2 层(微代码层)

7.1. 计算机组成

介绍 LG1 层是如何与 ISA3 层联系的 Mc2 层的作用即是控制 LG1 层的数据流动,然后给 ISA3 层提供统一的接口


Author: Harumi Kiyama (lucius0720@hotmail.com) Create Date: 2024-08-14 Last modified: 2024-08-19 Mon 08:21 Creator: Emacs 31.0.50 (Org mode 9.7.9)