ARM学习之路(一)计算机体系结构

计算机体系结构

我们编写的程序,除了指令以外还有很多的数据,指令和数据都需要存储在存储器中,根据保存方式的不同,计算机可以分为两种不同的结构:冯洛伊曼架构和哈弗架构。

冯洛伊曼结构

特点:指令和数据混合存储在同一个存储器上

数据和指令存放在同一个存储器的不同物理地址上,一般存放在外部存储器中。程序运行时,数据和指令从外存储器加载到内存储器上(内存储器支持随机访问,速度快),X86,ARM7,MIPS都采用这种架构。

哈弗结构

特点:指令和数据独立存储,分别被存放在程序存储器和数据存储器中,各个存储器独立编址,独立访问,指令和数据可以在一个时钟周期内并行访问。

CPU实现会更加复杂,8051单片机采用这种结构。

混合结构

问题:随着现在CPU工作频率越来越高,会出现一个和RAM之间的频率差的问题: CPU的主频一般都是GHZ级别,而对应的内存RAM一般在几百MHZ级别(目前 DDR4可以工作在GHZ级别了)由于CPU与RAM之间传输数据,需要经过寻址,取数据,配置,等待,输出数据等多个时钟周期,内存瓶颈会拖慢CPU的工作节奏,影响整体的效率。

方案:CPU引入了CACHE机制,分为指令CACHE和数据CACHE,用来缓存数据和指令,提升计算机的运行效率。

现代的ARM SOC 一般采用如上结构,SOC芯片内部的CACHE 层采用哈弗结构,集成了指令CACHE和数据CACHE

当CPU要到RAM读取数据时,RAM一次缓存一批数据到CACHE中,CPU会先到这两个CACHE 中去看下需要读取的数据和指令是否在CACHE 中,如果没有,则称为缓存未命中(CACHE miss)再到RAM中读取,如果在,则称为缓存命中,CPU就直接拿CACHE中的数据。

当CPU要写数据到RAM中,可以先将数据写到CACHE中,例如要往地址16写一个0,这时候只是写到了CACHE里面,这个时候CACHE 和 RAM的缓存是不一致的,缓存的每一块空间一般会有一个标记位“dirty bit”,用来记录这种变化,当cache 需要刷新的时候,在清理CACHE的时候,会检查这个“dirty bit” ,为1则将变化的数据写回到RAM中。

CACHE机制

CACHE在物理上可以理解为 SRAM ,其运行的速度介于CPU和DRAM之间,用以解决两者速度不匹配的问题,本质上还是利用空间换时间,通过自身的缓存来减少CPU访问内存的次数,提高系统的整体性能。

现代的CPU一般会采用多级CACHE:一级CACHE ,二级 CACHE 甚至还有三级CACHE

CPU会首先在L1 cache中进行读取数据,如果数据未覆盖,才会前往L2 cache读取数据,一般按照每一级的cache覆盖率为80%左右,那么两级cache的覆盖了就能达到96%,剩余未覆盖的数据已经非常少了。

总之:CACHE的出现时为了解决CPU和内存之间的带宽瓶颈,并不是所有的处理器都有cache ;目前 cortex-M0,cortex-M1,cortex-M2/M3/M4 系列都没有cache:

一方面:对于以上的一些低功耗,低成本处理器,CPU内部集成cache 会增加芯片的面积和发热量,不仅会增加功耗,成本也会增加不少。

另一方面:这些处理器本身工作频率不高,与RAM之间不存在带宽问题瓶颈

再一方面:使用cache无法保证实时性,当缓存未命中时,CPU从RAM中读取数据的时间是不确定的,这在很多工业场景是不允许的。

流水线机制

一条指令的执行分为三个基本流程:取指令,翻译指令,执行指令

这在CPU的内部会区分出三个不同的单元:取指单元,译码单元,执行单元。我们假设每一个步骤的执行时间是一个时钟周期,那么一条指令执行完就需要三个周期,那么就会存在如下的问题:取指单元只在第一个时钟周期内工作,其余两个时钟周期处于空闲状态,其余两个执行单元也是如此。这样执行效率较低。

解决方案是:引入流水线

引入流水线之后,从第二个时钟周期开始,译码单元翻译指令1,取指单元开始取指令2,第三个周期开始所有的单元都开始投入工作进入满负荷状态。上图便是ARM的三级流水线示意图。

引入流水线之后原来一条指令需要三个时钟周期,现在就只需要一个时钟周期,效率提升了三倍

超流水线技术

在CPU内部,耗时最长的那个工序单元决定了CPU的整体性能,可以联想到木桶效应。那么这个时候就需要对这道工序在进行细分,我们让每一道工序的执行时间尽量变得短起来,那么当流水线跑起来的时候,整体的效率就能提高更多,CPU的性能就会更加的强劲。

那么想要提升CPU的主频,目前有三种方法:
1.优化各级流水线性能,这受限于当前芯片制造的水平
2.依靠半导体制造工艺,制程越先进,芯片面积就越小,发热就越小,这样CPU的性能就可以更好的释放
3.不断增加流水线深度,流水线越深,各级流水线延迟就越小,主频就能得到提升

? 流水线越深越好吗?

由于流水线的本质是以空间换时间,流水线越深,电路就会越复杂,芯片面积随之增大,功耗也就随之增加,这对于移动设备来说是无法接受的。

流水线靠指令的并行执行来提升CPU性能,这对于顺序执行的指令流程来说确实可以提升效率。但是当程序指令中存在跳转,分支结构,那么预取的指令就需要全部丢掉,到需要跳转的地方重新取指!

根据上面这个例子,BEQ是一个条件跳转命令,如果R1和R2的值相等,就跳转到here处执行,当BEQ指令执行的时候,下面的ADD指令已经取指和译码了,如果这个时候触发跳转到here,那么流水线中已经预取的指令就无效了

那么就存在一个问题:流水线越深,一旦出现需要跳转,那么就会有越多的预期指令被丢弃,损失和浪费就会越严重。
从跳转的地方从新取指,那么整个流水线就会停顿下来,这种情况我们一般称之为流水线冒险!

流水线冒险分为三种情况:

机构冒险:

两条指令都需要访问同一个寄存器,硬件资源发生冲突,这种情况我们直接对冲突的文件进行重命名即可!

数据冒险:

当前执行的指令需要上一条指令执行的结果,上一条指令没有运行结束,当前指令就无法执行。只能暂停执行。解决方法是在ADD指令之后加入pipeline bubble ,暂缓SUB指令的执行,等ADD指令将运算结果写回R2寄存器即可。

现代经典流水线一般包含5级,我们可以在第2和第3个时钟周期添加一个空泡指令:

控制冒险: 也是如此,当程序接下来不知道执行到哪儿的时候,就加几个空泡指令,等BEQ执行结束后再取指令就可以了!

异构计算

随着CPU的压力越来越大,集成电路工艺跟不上,摩尔定律快要失效了! 这个时候很多芯片厂商开始设计布局新型架构–异构计算

异构计算:在SOC(片上系统)中集成不同架构的CORE,如DSP,GPU.NPU,FPGA等。CPU在整个SOC中用于处理分支跳转预测等复杂逻辑;GPU处理视频和图像逻辑,FPGA处理数字信号等等。每一个core负责单独处理某一些事务,缓解了CPU的压力。

总线与地址

物理地址:即CPU管脚发出的一组地址控制信号。

如果我们有一个4字节的RAM内存,有8字节的地址空间;我们使用两片RAM和一根片选信号线。假设片选信号低电平有效,那么当CSA1A0为000,001,010,011的时候,CPU访问第一片RAM的4字节地址空间,第二片类似。

如上,地址信号线的位数决定了寻址空间的大小。如上三根地址线就可以有8字节的寻址空间,那么再一个32位的计算机系统中,就会有4GB大小的寻址空间。

如果在带有MMU的CPU平台下面,程序运行一般会使用虚拟地址,而不是直接操作物理地址!MMU将虚拟地址转换为物理地址,通过CPU管脚发送出去,地址信号通过译码,选中指定的内存存储单元,在进行读写操作。至于转换的过程,我在之前的一篇文章中有讲到过!

总线:各种数字信号的集合,包括地址信号,数据信号,控制信号等!还可以为挂在总线上的设备提供电源,不同的总线的读写时序和工作频率都不一样,通过桥来连接。 桥是一种芯片组电路,用以将一种总线的电子信号翻译成另一种总线的电子信号。

内存RAM和外部设备挂在同一总线下,那么计算机如何为他们分配地址?

计算机采用两种编址方式:统一编址和独立编址。

统一编址:内存RAM和外设共享CPU的寻址空间。ARM和MIPS架构都采用这种统一编址的方式。CPU可以像操作内存RAM一样去读写外部设备的寄存器。

独立编址:内存RAM和外设占用不同的地址空间,如X86架构。外设有64KB的独立地址空间,需要专门的IN/OUT指令才能访问,被称为I/O地址空间。

更多内容请关注个人公众号:学习学个der

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值