操作系统–前言03--程序执行过程

程序执行过程

当 CPU 执行程序的时候:

  1. cpu读取PC指针指向的指令,将他导入指令寄存器.PC(Program Counter)程序计数器,也是一种寄存器。
  • CPU 的控制单元操作地址总线指定需要访问的内存地址

  • CPU 通知内存设备准备数据

  • CPU收到内存传来的数据后,将这个数据存入指令寄存器

    完成以上 3 步,CPU 成功读取了 PC 指针指向指令,存入了指令寄存器。

2.CPU分析指令寄存器中的内容,并分析指令的类型和参数.

3.如果是计算机类型指令,就交给逻辑单元计算;如果是存储类型的指令,难就由控制单元执行.

4.PC指针自增,并准备获取在一条指令

如果是32位的机器上,指令就是32个bit(4 byte) ,需要4个内存地址,所以自增4指令的执行速度:通过石英晶体的脉冲转化成时钟信号驱动的,每次高低电平的转换就是一个周期。我们称为时钟周期。

在这里插入图片描述


  • 内存虽然是一个随机存取器,通常不会把指令和数据存在一起,这是为了安全起见。
  • 程序指针也是一个寄存器,64 位的 CPU 会提供 64 位的寄存器,这样就可以使用更多内存地址。特别要说明的是,64 位的寄存器可以寻址的范围非常大,但是也会受到地址总线条数的限制。比如和 64 位 CPU 配套工作的地址总线只有 40 条,那么可以寻址的范围就只有 1T,也就是 2^40。
  • 从 PC 指针读取指令、到执行、再到下一条指令,构成了一个循环,这个不断循环的过程叫作CPU 的指令周期

a=11+15的CPU执行过程:

1.编译器通过分析,发现 11 和 15 是数据,因此编译好的程序启动时,会在内存中开辟出一个专门的区域存这样的常数,这个专门用来存储常数的区域,就是数据段,如下图所示:

  • 11 被存储到了地址 0x100;

  • 15 被存储到了地址 0x104;

在这里插入图片描述

2.编译器将a=11+15转换成了 4 条指令,程序启动后,这些指令被导入了一个专门用来存储指令的区域,也就是正文段。如上图所示,这 4 条指令被存储到了 0x200-0x20c 的区域中:

  • 0x200 位置的 load 指令将地址 0x100 中的数据 11 导入寄存器 R0;

  • 0x204 位置的 load 指令将地址 0x104 中的数据 15 导入寄存器 R1;

  • 0x208 位置的 add 指令将寄存器 R0 和 R1 中的值相加,存入寄存器 R2;

  • 0x20c 位置的 store 指令将寄存器 R2 中的值存回数据区域中的 0x1108 位置。

3.具体执行的时候,PC 指针先指向 0x200 位置,然后依次执行这 4 条指令。

  • 变量 a 实际上是内存中的一个地址,a 是给程序员的标识符。

  • 每次操作 4 个地址,也就是 32 位,这是因为在用 32 位宽的 CPU 举例。在 32 位宽的 CPU 中,指令也是 32 位的。但是数据可以小于 32 位,比如可以加和两个 8 位的字节。

指令

构造指令的过程,叫作指令的编码,通常由编译器完成;解析指令的过程,叫作指令的解码,由 CPU 完成。由此可见 CPU 内部有一个循环:

  • 首先 CPU 通过 PC 指针读取对应内存地址的指令,叫作 Fetch,就是获取的意思。

  • CPU 对指令进行解码,叫作 Decode。

  • CPU 执行指令,我们将这个部分,叫作 Execution。

  • CPU 将结果存回寄存器或者将寄存器存入内存, Store。

在这里插入图片描述

上面 4 个步骤,我们叫作 CPU 的指令周期。CPU 的工作就是一个周期接着一个周期,周而复始。

指令的类型

不同类型(不同 OpCode)的指令、参数个数、每个参数的位宽,都不一样。而参数可以是以下这三种类型:

  • 寄存器
  • 内存地址
  • 数值(一般是整数和浮点)

论是寄存器、内存地址还是数值,它们都是数字。

指令从功能角度来划分,大概有以下 5 类:

  1. I/O 类型的指令,比如处理和内存间数据交换的指令 store/load 等;。
  2. 计算机类型指令,最多处理两个寄存器,加减法,位运算,比较大小
  3. 跳转类型指令,用处就是修改PC指针,比如编程中大家经常遇到需要条件判断+跳转的逻辑,比如 if-else,swtich-case、函数调用等.
  4. **信号类型的指令,**比如发送中断的指令trap;
  5. 闲置CPU的指令NUP,一般 CPU 都有这样一条指令,执行后 CPU 会空转一个周期。

指令还有一个分法,就是寻址模式,比如同样是求和指令,可能会有 2 个版本:

  1. 将两个寄存器的值相加的 add 指令。

  2. 将一个寄存器和一个整数相加的 addi 指令。

加载内存中的数据到寄存器的 load 指令也有不同的寻址模式:

  1. 直接寻址:直接加载一个内存地址中的数据到寄存器的指令la.
  2. 寄存器寻址:直接将一个数值导入寄存器的指令LI.
  3. **间接寻址:**将一个寄存器中的数值作为地址,然后再去加载这个地址中的数据的指令LW.

因此寻址模式是从指令如何获取数据的角度,对指令的一种分类,目的是给编写指令的人更多选择。

指令的执行速度:

指令的执行速度:通过石英晶体的脉冲转化成时钟信号驱动的,每次高低电平的转换就是一个周期。我们称为时钟周期。

通过石英晶体的脉冲转换成时钟信号驱动,每次高低电平的转换就是一个周期,我们称为时钟周期

总结

64 位和 32 位比较有哪些优势?

【解析】 分类讨论:

如果说的是 64 位宽 CPU,那么有 2 个优势:
  • 优势 1:64 位 CPU 可以执行更大数字的运算,这个优势在普通应用上不明显,但是对于数值计算较多的应用就非常明显。

  • 优势 2:64 位 CPU 可以寻址更大的内存空间

如果 32 位/64 位说的是程序,

那么说的是指令是 64 位还是 32 位的。

  • 32 位指令在 64 位机器上执行,困难不大,可以兼容。

  • 如果是 64 位指令,在 32 位机器上执行就困难了。因为 32 位指令在 64 位机器执行的时候,需要的是一套兼容机制;但是 64 位指令在 32 位机器上执行,32 位的寄存器都存不下指令的参数。

  • 操作系统也是一种程序,如果是 64 位操作系统,也就是操作系统中程序的指令都是 64 位指令,因此不能安装在 32 位机器上。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值