重学操作系统(一)

131 阅读4分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情

冯诺依曼模型

冯诺依曼定义计算机基本结构为5个部分,分别是cpu,内存,输入设备,输出设备,总线。

内存

程序和数据都在内存,存储的区域是线性的。

数据存储单位是bit,最小的存储单位是字节,1字节等于8位

内存的地址是从0开始编号,自增排列,最后一个地址为内存总字节数-1。就像一个数组一样,内存读写一个数据的速度都是一样的

cpu

32位和64位cpu的区别在于一次能计算多少字节数据

32位一次可以计算4个字节

64位一次可以计算8个字节

32位和64位成为cpu的位宽

cpu这样设计,是为了能计算更大的数值,如果是8为,那只能计算0-255范围的数据,cpu位宽越大,可以计算的数值就越大

cpu内部还有一些组件,比如寄存器,控制单元,alu等,控制单元负责控制cpu工作,alu负责计算,寄存器分为很多类,各司其职。

为什么还要寄存器

寄存器主要来存储运算时的数据,内存离cpu太远,cpu从内存获取数据太慢了,从cpu里面的寄存器获取数据很快

常用的寄存器种类

通用寄存器,存放要运算的数据

程序计数器pc 存储cpu要执行的下一条指令的地址

指令寄存器 存放指令

总线

地址总线 指定cpu将要操作的内存地址

数据总线 用于读写内存的数据

控制总线 用于发送和接受信号 比如中断

cpu读写内存数据,一般需要通过两个总线

首先要地址总线获取内存的地址

通过数据总线来传输数据

64位一定比32位好吗

如果用32位cpu让两个64位的数字相加,需要分成2个32位低位和2个32位高位,低位相加得到近位,然后高位相加再加上近位,组合出来答案。而64位可以一次性得到答案。

然而事实上很少有超过32位的计算。只要计算数额不超过32位,性能上区别是不大的,超过32位,64位cpu的性能才能发挥出来。

此外,32位cpu最大只能操作4gb的内存,就算装了8gb内存条也没用,64位的cpu内存寻址就很大了,2的64次方

a=1+2是怎么执行的

程序编译过程中,编译器分析代码,发现1和2是数据,所以内存会有个数据段来存放这些数据

假设1存放到0x100 2存放到0x104

编译器会把a=1+2翻译成4条指令 放到正文段

0x200 load 0x100->r0

0x204 load 0x104->r1

0x208 add r0 r1 r2

0x20c store r2->a的地址

执行程序的时候 程序计数器pc会被设置成0x200,然后按序读入指令

上述例子,由于是在32位cpu,所以指令的大小是4个字节,指令地址之间间隔就是4

数据大小是根据你在程序中指定的变量类型,比如int就是4个字节,char就是1个字节

指令

上述指令是容易理解的汇编代码,事实上指令是一串二进制编码,每条指令都会有相应的编码,cpu通过对解析这个编码来得到指令的内容。

指令集就很多了,比如mips,risc-v

下面举mips,mips指令是一个32位的整数

image-20220403223048887.png

r指令 用在算术相关

i指令 数据传输,条件分支

j指令 跳转

add就属于r指令

2.png

add的opcode是000000

第一个寄存器是r0 编号00000

第二个寄存器是r1 编号00001

rd代表目标的临时寄存器 编号00010

因为没有位移操作所以都是0

从而拼凑出这条add指令的mips指令编码

指令周期

取指令->指令译码->执行指令->数据回写

取指令阶段,指令是放在存储器里面的,控制器从程序计数器pc和指令寄存器来取出指令

指令译码,也是由控制器近现代

指令执行,是由alu操作的,但是如果是无条件跳转,那就是完全在控制器执行