操作系统作为所有程序运行的载体,了解其基本组成和运行的逻辑也是十分重要的。虽然要弄明白它的方方面面需要花很长的时间,但作为底层码弄,弄清楚与平常程序打交到的CPU、内存、磁盘等工作原理也十分重要。因此这里我将学习的过程和知识点做一个记录,方便知识的记录和查询。
什么是CPU
CPU(Central processing Unit)中央存储单元是一块超大的集成电路。CPU主要由运算器,控制器,寄存器和内部总线等部件组成。
运算器
运算器主要由,算数逻辑单元(ALU)、累加寄存器、数据缓冲寄存器、和状态条件寄存器组成。它是数据加工的处理部件,完成各种算数和逻辑运算。它是执行部件,所有的操作都根据控制器发送的指令进行,运算器主要有下列两种功能:
(1)执行所有算数运算,加减乘除基本运算级附加运算
(2)执行所有逻辑运算,如与、或、非、零值测试或两个值的比较等
运算器各部件功能:
(1)ALU(Arithmetic and logic unit)负责处理数据,实现对数据的算数运算和逻辑运算
(2)累加寄存器(AC)它是一个通用寄存器为ALU计算时提供一个工作区
(3)数据缓冲寄存器(DR),通用寄存器缓存从内存储器读取指令或数据字,并为不同时段读取的数据进行隔离
(4)状态条件寄存器(PSW),保存有运算器执行算数运算和逻辑运算或测试的结果建立各种条件吗和内容,保存当前指令执行结果的状态。算数运算产生一个结果,而逻辑运算产生一个判决
控制器
控制整个CPU的工作,控制器一般包含指令控制逻辑,时序控制逻辑、总线控制逻辑和中断控制逻辑几个部分。
它的组成部分为:
(1)指令寄存器(IR),cpu读取指令时先把它从内存储器中读取到缓冲寄存器,在放入指令寄存器中,指令译码器解析指令,产生操作命令控制其他部件
(2)程序计数器(PC),也称指令计数器。指令的执行分为两种,一种是顺序执行,一种是转移执行。在程序开始执行的时候,将程序的初始地址送如PC中,如果是顺序执行则只需要将地址+1,如果是转移指令则是在当前地址上加上向前或向后的位移量,或者直接给出转移地址
(3)地址寄存器(AR),AR用于存储当前cpu所访问内存单元的地址。由于内存和cpu在操作的速度上存在着差异,所以需要AR保存地址,直到内存的读写完成。
(4)指令译码器(ID),指令分为操作码和地址码两个部分,译码器就是对操作码部分进行进行分析,识别出指令规定的操作以向各部件发送命令。
寄存器组
寄存器组分为通用寄存器和专用寄存器,运算器和控制器中的寄存器为专用寄存器。通用寄存器可有程序员规定器用途。
内部总线
内部总线将处理器的所有结构单元相连,它的宽度可以是8位,16,32,64等
目前比较流行的几种内部总线技术:
I2C,SPI,SCI
多核CPU
多和CPU是指在一块CPU芯片上集成多个CPU单元,每个单元都有控制单元,运算单元,中断处理单元,一级缓存和二级缓存
什么是内存
内存也称为内存储器或主存储器
内存是外存与CPU沟通的桥梁,所有的应用程序都是运行内存中。当操作系统运行时,会将需要计算的数据从内存方在CPU进行计算,完成之后在写回内存。
大家都直到计算机其实是使用0和1的电路位来标示数据的,这里我们只需要直到,向内存cpu等部件的物理设备能存储这种0和1的电信号就可以,内存中一般包含一个内存地址和具体的用二进制保存的内存数据。
前面有提到,CPU的控制器的AR中或存储内存储器的地址,通过地址与内存进行交互。
接着来了解一下,平时我们程序所交互的内存到底是个什么样的结构?
我们先来了解大致了解一下操作系统的内存结构:
计算机的主存可以看做是N个连续字节大小的单元组成的数组,每个字节单元有自己的物理地址成为PA
这种cpu直接直接访问主存的方式有中弊端:
- 首先所有进程共享内存,如果直接使用主存则空间很快会被用光
- 如果进程间的主存可以互相访问,则很容易导致物料地址空间被破坏导致程序异常
所以现在操作系统会在cpu和主存总加上一层,虚拟内存virtual Memory
由MMU将虚拟地址转换为实际的物理地址。
在32位系统上虚拟地址的空间为2^32bit=4G, 在64位系统上只使用到低48位为2^48bit=256T。使用虚拟地址可以提供更大的地址空间、地址空间连续使程序认为它的内存地址空间都是连续的、可以对不同进程间的内存进行隔离,同时可以将同一块物理内存映射到两个虚拟内存实现内存空间的共享。
这里我们稍微探讨一下虚拟地址是如何映射到物理地址的?
(这里有涉及到内存分段和分页的概念,因为分段存在着许多的坏处,比如内存碎片等,因此现在操作系统大部分都是采用分页模式)
由cpu生成的每个逻辑地址包含两个部分,p表示页表中的索引号,d表示偏移量
页表中存的是每个内存的基地址,真是的内存地址是通过基地址+偏移量。
页的大小和帧的大小一致都为2的幂,设置成2的幂次,可以方便cpu将逻辑地址转为计算页号和偏移量,如果逻辑地址空间为2^m 次方,页的大小为2^n次方,那么逻辑地址的高m-n位则为页号,低n位表示页偏移量。按照这种计算方式:
则虚拟地址8转为二进制表示为1000, 高2位为2,偏移量为0,2对应页码中的基地址为1,则实际内存地址为4*1+0=4,所以放在内存为4的位置
当一个进程启动时,计算机将检查该进程的大小,并为期查找空间的内存帧。将帧码一页一页放入页码列表中。
由于操作系统管理内存,因此它必须知道内存每一帧的具体状况。是在用还是空闲。因此操作系统中有一个帧表的数据结构用以记录这些内容。
操作系统会为每个进程保留一个也表的副本,当需要进行虚拟内存与物理内存转换的时可以用到。
看下硬件支持
操作系统有自己保持页表的方法,一般计算机会采用cpu寄存器的方式来保存也表,但随着页表的增大,寄存器容量明显不足,这时就会使用转换表缓冲区(TLB)来加速访问
其机构如下:
参考资料:
软件设计师考试同步辅导第四版
内存分页机制完全攻略