软件工程师编写的代码最终是在处理器上执行,因此我们有必要清楚处理器的内部构造。清楚了处理器的内部构造有助于我们去理解代码的运行逻辑。我们一起来看下面这个问题:
为什么很多编程规范中规定函数的参数不要大于4个?
很多处理器体系都有一个规范(ARM体系有AAPCS规范),规定使用特定的4个寄存器传递函数参数,参数大于4个时需要将参数放入堆栈中,因此参数过多的函数会有一个操作堆栈的过程,会影响执行效率,因此编程规范中规定函数的参数不要大于4个。了解处理的内部构造非常有必要,也会让编程思维更有穿透性,接下来我们一起了解一下处理器的内部构造。
处理器模型1
下图是一个简单的处理器模型如下:
处理器包括一个PC寄存器,寄存器堆(一组通用寄存器),ALU和数据总线。通常情况下指令存储器(FLASH)和数据存储器(SDRAM)在处理器外部。PC寄存器从指令存储器中取得指令,指令经过译码,并经过ALU进行逻辑运算,得到的数据存到数据存储器中。
处理器模型2
前展示的处理器模型存在一个问题,无法进行译码操作,译码操作就是获取指令的操作码,翻译操作码的功能,控制处理器中的各个单元。增加译码功能的处理器模型如下:
控制”单元翻译指令操作码,控制ALU和分选器。
处理器模型3
前面展示的处理器模型不支持分支跳转指令,增加分支跳转功能后的处理器基本上已经“五脏俱全”了,处理器模型如下图:
处理器执行阶段
通常情况下处理器执行指令有5个阶段:取值,译码,执行,访存,回写。
1、IF:取指令
2、ID:指令译码,操作寄存器堆
3、EX:执行
4、MEM:访问数据存储器
5、WB:回写数据到寄存器堆
处理器流水线构造
现在的处理器通常有流水线结构,流水线结构可以极大地提高处理器执行速度,带流水线功能的处理器模型如下:
流水线设计就是在处理器每个执行阶段后增加一级缓存。
流水线工作示意图如下:
处理器流水线工作动态图如下:
流水线数据冒险和控制冒险
流水线中有两个重要概念:数据冒险和控制冒险(这里不详细描述,感兴趣的朋友们可以查找相应资料),增加数据冒险和控制冒险之后的处理器模型如下图:
处理器中断(异常)
处理器还有一个非常重要的功能:中断(异常),异常和中断可以统称为中断。 当中断生时, 会迫使处理器从当前正在执行的程序转移到另一个程序(中断处理程序)中去。增加异常功能后的处理器模型如下:
上图中的0X80000180为中断服务地址。中断分为:向量中断和非向量中断。
创作不易希望朋友们点赞,转发,关注。希望获取源码和相关资料的朋友们请在评论区里留言。
作者:李巍
Github:liyinuoman2017