零、以一个程序的运行作为引子

一个程序是如何运行的?这看起来是个简单的问题,实际上涉及到了许多复杂的内容:

  1. 计算机体系架构(CPU-内存-I/O设备-外存);
  2. 数据在计算机硬盘与内存中的保存形式;
  3. CPU如何进行运算(加法器);
  4. CPU中的寄存器如何存储需要运算的数据(通用寄存器);
  5. CPU中的寄存器如何知道要怎么处理数据(指令寄存器–控制总线);
  6. CPU如何从内存中传输数据与控制(数据总线与控制总线);
  7. CPU如何对内存地址进行定位(分段、分页);
  8. 内存地址是如何分配使用的(线性地址与物理地址,寻址方法);
  9. 分段与分页式管理方法的意义;
  10. 进程的概念是什么;
  11. 进程如何管理一个程序;
  12. 进程与CPU和内存的关系是什么(通过总线相连,进行数据交换);
  13. (更为复杂的)多进程之间的资源争抢问题(锁、死锁);
  14. 中断(I/O中断与内存缺页中断等)
  15. 操作系统设计的权限划分(用户空间与内核空间);
  16. 如何用栈传递参数?函数的开始和结束的本质是什么(内存空间、CPU栈等角度)?

一、CPU的工作原理

CPU的发展历史

此处我们主要考虑的是8086这一经典的CPU型号,以及80386包含了分页功能的CPU型号。
为了从原理角度理解CPU的运行,首先以8086为例进行说明,而先不考虑更加高级的分页内存管理方式。(此处可以参考王爽《汇编语言》)

计算机是如何运行的:从CPU到内存管理

CPU的组成

在逻辑角度上来看,CPU要想进行计算,需要具备什么样的功能呢?
i) 首先需要有计算能力(当然该能力首先就默认CPU具有数据存储的能力)。
ii) 第二应该具有数据传输能力,用于和内存之间进行数据的传递;
iii) 还应该有控制线,即控制下一步做些什么操作;

基于以上三点需求,满足后就可以从最简单的角度上允许CPU进行计算。
那么CPU是如何逻辑划分的呢?从硬件角度上又包含什么呢?

首先引入一个概念:寄存器
寄存器是CPU中的存储单元。其逻辑结构都相同,如8086CPU中所有寄存器都是16位的,
计算机是如何运行的:从CPU到内存管理
显然,该寄存器一次能存放一个16Bit的数据,即2^16=65536。

按照上面的需求,寄存器被分为如下几种类型:

  1. 内存数据寄存器(MDR):是一个内存缓存的寄存器,用于存放一个数据值本身。这个数据值可能会存放到MAR中,也可能是从MAR中获得的。
  2. 内存地址寄存器(MAR):用于存放某个内存单元的地址,将内存单元地址存入该寄存器,便可取出,从而获得内存中该处的值。
  3. 指令寄存器(IR):存放当前正在处理的指令。
  4. 程序计数器(PC或IP):存放当前要执行的地址。

指令寄存器能够执行的功能:
mov
add
jmp

那么有了以上几种类型的寄存器,CPU是如何执行一段内存中的指令的呢?
首先需要知道CPU访问内存地址的方式,才能将指令和数据从内存读取到CPU中。

如上面所说,CPU与内存之间有三大总线:地址总线(用于传输地址)、数据总线(用于传输数据)、控制总线(用于传输指令)。而对于CPU来说,只有知道了内存的物理地址才能进行实际的操作。

CPU的内存寻址方式

对于8086CPU来说,其采用的是分段式处理方式。CPU中的相关部件提供了两个16位的地址,一个是段地址,一个时段内偏移地址。将段地址和偏移进行移位相加(*16),可以获得实际的物理地址。

其实这是一种通用的寻址方法。即:

物理地址 = 基础地址 + 偏移地址

问题:段地址如何给出?

分段的意义?

指令的定义

无论数据还是指令,都是一些数字。而区分开来便有了意义。
对于指令,从人为定义的角度上规定好了某些数字的含义,这便是指令集。

CPU中寄存器的数目与种类?
从硬件角度上来看,CPU是什么样子的?

问:为什么设计者将寄存器进行分类,而不和内存一样采取通用的存储方式?
答:可能是角色不同:CPU需要运算,而运算的时候,其步骤可以被整理为通用的步骤,因此将其进行预先定义,有利于实现。而内存只是为了存储数据,因此无需(也不能)进行预先定义某个内存地址的作用。


二、内存的组成

内存的硬件结构

内存的物理地址编码

内存的寻址

内存管理:分段

什么是内存分段

为什么发明了分段式内存管理

分段内存管理是如何实现的

如何使用分段内存管理

CPU如何进行内存寻址

CS:IP结构:

内存管理:分页

什么是内存分页

页框与寻址

分页管理的好处是什么

分页管理与分段管理的区别是什么?

CPU如何对一个分页管理的内存系统进行寻址?

中断: 缺页中断

什么是缺页中断
缺页中断是如何运作的?

四、CPU与内存的关系

计算机是如何运行的:从CPU到内存管理

寄存器

什么是寄存器

寄存器的作用是什么

寄存器在硬件角度是如何实现的

寄存器如何与内存配合使用

CPU的栈

CPU如何载入程序

CPU的栈的作用

CPU的栈的实现

五、程序如何运行

计算机是如何运行的:从CPU到内存管理
计算机是如何运行的:从CPU到内存管理

进程这一概念的发展

进程需要解决什么问题

进程的管理

进程的组成部分

进程控制块

进程控制块如何进行内存寻址

进程控制块如何将内存中的数据传入CPU

进程在内存中的存放形式

CPU如何继续下一步操作

举一个程序运行的例子,从在内存中的存储形式、CPU在内存中的寻址、分段/分页 、寄存器的使用等角度进行考虑

List item


多个进程的调度

两状态模型与五状态模型

竞态:锁

什么是竞态?什么是锁?为什么需要锁?
什么是锁?为什么会出现死锁
如何避免死锁

进程与线程

进程与线程的关系

线程间通信的方法

共享什么资源,如何共享


三、中断

什么是中断?为什么出现了中断的概念?

中断是由什么产生?

中断的硬件实现?

中断的按需分类?

举一个中断的例子

中断如何保存CPU中的现场,保存在哪里?如何恢复现场?需要如何进行寻址?

相关文章:

  • 2022-12-23
  • 2021-04-20
  • 2021-06-25
  • 2021-06-17
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2021-04-09
  • 2021-08-13
  • 2021-10-31
  • 2021-09-28
相关资源
相似解决方案