零、以一个程序的运行作为引子
一个程序是如何运行的?这看起来是个简单的问题,实际上涉及到了许多复杂的内容:
- 计算机体系架构(CPU-内存-I/O设备-外存);
- 数据在计算机硬盘与内存中的保存形式;
- CPU如何进行运算(加法器);
- CPU中的寄存器如何存储需要运算的数据(通用寄存器);
- CPU中的寄存器如何知道要怎么处理数据(指令寄存器–控制总线);
- CPU如何从内存中传输数据与控制(数据总线与控制总线);
- CPU如何对内存地址进行定位(分段、分页);
- 内存地址是如何分配使用的(线性地址与物理地址,寻址方法);
- 分段与分页式管理方法的意义;
- 进程的概念是什么;
- 进程如何管理一个程序;
- 进程与CPU和内存的关系是什么(通过总线相连,进行数据交换);
- (更为复杂的)多进程之间的资源争抢问题(锁、死锁);
- 中断(I/O中断与内存缺页中断等)
- 操作系统设计的权限划分(用户空间与内核空间);
- 如何用栈传递参数?函数的开始和结束的本质是什么(内存空间、CPU栈等角度)?
一、CPU的工作原理
CPU的发展历史
此处我们主要考虑的是8086这一经典的CPU型号,以及80386包含了分页功能的CPU型号。
为了从原理角度理解CPU的运行,首先以8086为例进行说明,而先不考虑更加高级的分页内存管理方式。(此处可以参考王爽《汇编语言》)
CPU的组成
在逻辑角度上来看,CPU要想进行计算,需要具备什么样的功能呢?
i) 首先需要有计算能力(当然该能力首先就默认CPU具有数据存储的能力)。
ii) 第二应该具有数据传输能力,用于和内存之间进行数据的传递;
iii) 还应该有控制线,即控制下一步做些什么操作;
基于以上三点需求,满足后就可以从最简单的角度上允许CPU进行计算。
那么CPU是如何逻辑划分的呢?从硬件角度上又包含什么呢?
首先引入一个概念:寄存器。
寄存器是CPU中的存储单元。其逻辑结构都相同,如8086CPU中所有寄存器都是16位的,
显然,该寄存器一次能存放一个16Bit的数据,即2^16=65536。
按照上面的需求,寄存器被分为如下几种类型:
- 内存数据寄存器(MDR):是一个内存缓存的寄存器,用于存放一个数据值本身。这个数据值可能会存放到MAR中,也可能是从MAR中获得的。
- 内存地址寄存器(MAR):用于存放某个内存单元的地址,将内存单元地址存入该寄存器,便可取出,从而获得内存中该处的值。
- 指令寄存器(IR):存放当前正在处理的指令。
- 程序计数器(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在内存中的寻址、分段/分页 、寄存器的使用等角度进行考虑
List item