本文是一个衔接点,上一篇文章以前都是学习8086实模式的知识。本文开始学习80386这种现代处理器的编程架构。由此进入保护模式的学习。点击链接查看上一篇文章:上一篇文章
1、现代处理器的结构和特点
1 流水线技术
处理器可以做很多事情,能够执行各种不同的指令,完成不同的功能,但这些事情大多不会再一个时钟周期内完成。执行一条指令,需要从内存中取指令,译码,访问操作数和结果,并进行移位、加法、减法、乘法以及其他任何操作。
为了提高处理器的执行效率和速度,可以把一条指令的执行过程分解成若干个细小的步骤,并分配给相应的单元来完成。各个单元的执行都是独立的、并行的。如此一来,各个步骤在时间上就会重叠起来,这种执行指令的方法,就是流水线(Pipe-Line)技术。
比如,一条指令的执行过程分为取指令、译码和执行三个步骤的话。假设每个步骤都要花一个时钟周期,那么如下图所示,如果采用顺序执行,则执行三条指令就要花9个时钟周期,没3个时钟周期才能得到一条指令的执行结果;如果采用3级流水线技术的话,则执行这三条指令只需要5个时钟周期,每隔一个时钟周期就能够得到一条指令的执行结果。
2、高速缓存技术
高速缓存,在以前的文章中有讲的很详细,这里不再赘述,直接查看以前的文章即可。
点解下面链接查看:
其实简单来说高速缓存就是为了弥补外存(内存条)的读写速度过于缓慢的缺陷。将内存中的一些指令和数据,缓存到高速缓存中,那么CPU可以不用访问内存而直接访问高速缓存,这样会快的多!!!
3、乱序执行技术
为了实现流水线技术,需要将指令拆分成更小的可独立执行部分,即拆分成微操作。
一旦将指令拆分成微操作,处理器就可以在必要的时候乱序执行。考虑以下程序:
mov eax , [mem1]
shl eax , 5
add eax , [mem2]
mov [mem3] , eax
这里add eax , [mem2]可以拆分成两个微操作。先从mem2对应的地址取数据,然后将数据与eax寄存器中存的数据相加,得到的结果存入eax寄存器。如此一来,在执行逻辑左移指令的同时,处理器可以提前从内存中读取mem2的内容。典型的,如果数据不在高速缓存中,那么处理器在获取mem1的内容后,会立即开始获取mem2的内容,与次同时,shl指令的执行早就开始了。
类似的这种乱序执行很多很多,总给不在赘述。
4、寄存器重命名技术
考虑以例子:
mov eax , [mem1]
shl eax , 3
mov [mem2] , eax
mov eax , [mem3]
add eax , 2
mov [mem4] , eax
以上代码做了两件事情,但是互不相干。
- 将mem1的内容左移3次后,传给mem2
- 将mem3的内容加2后,传给mem4
如果我们为最后三条指令使用不同的寄存器,就更能清楚的看明白,这两件事的互不相干性。事实上,处理器也是这么做的。处理器为最后三条指令使用了另一个不用的临时寄存器,因此,左移和加法指令可以并行的处理。
IA-32架构的处理器只有8个32位的通用寄存器,但通常都会被我们全部派上用场(甚至还觉得不够)。因此我们不能奢望在每个计算机中都使用新的寄存器。不过在处理器内部,却有大量的临时寄存器可用,处理器可以重命名这些寄存器,但是以代表一个逻辑寄存器,比如上述的EAX寄存器。
寄存器重命名以一种完全自动和非常简单的方式工作。每当指令写一个逻辑寄存器时,处理器就为那个逻辑寄存器分配一个新的临时寄存器。
在所有操作都完成之后,那个代表EAX的临时寄存器里面存的内容就会被写入真实的EAX寄存器,该处理过程称为引退。
所有通用寄存器,栈指针寄存器,标志寄存器,浮点寄存器,甚至段寄存器都有可能被重命名。
5、 分支目标预测技术
流水线并不是百分之百完美的解决方案。实际上,有很多潜在的因素会使得流水线不能达到最佳的效率。一个典型的情况是,如果遇到一条转移指令,则后面那些已经进入流水线的指令就都无效了。换句话说,我们必须清空流水线,从要转移到的目标位置处重新取指令放入到流水线。
随着复杂架构下的流水线变得越来越长,程序分支带来的问题变得很大。为了解决这个问题,引入了分支预测技术。
从统计学的角度来看,有些事情一旦发生,下一次发生的概率很大。比如下面的程序片段:
xor si , si
lops:
......
cmp si , 20
jnz lops
当jnz指令第一次执行时,转移一定会发生。那么处理器就可以预测,下一次它还会转移到标号lops处,而不是顺序往下执行。事实上,这个预测通常是很准的。
在处理器内部,有一个小容量的高速缓存器,叫做 分支目标缓存器(BTB)。当处理器执行了一条分支语句后,它会在BTB中记录当前指令的地址、分支目标的地址。以及本次分支预测的结果。下一次,在那条转移指令实际执行之前,处理器会查找BTB中,看有没有最近的转移记录。如果能找到最近的条目,则推测执行和上次相同的分支,把该分支的指令送入流水线。
当该指令执行时,如果预测是失败的,那么清空流水线,同时刷新BTB中的记录。这个代价很大。
细心的人早已发现,这其实就是一个缓存的思想!!!这个思想很牛逼!!!
2、总结
理解现代处理器的结构特点:
- 流水线技术
- 高速缓存思想
- 乱序执行思想
- 寄存器重命名
- 分支目标预测技术
其实这些思想,在以后的上层软件开发中,也是经常遇到。
笔记记得不是很全,如果有不懂的可以加我联系方式一起交流。
学习探讨加个人:
qq:1126137994
微信:liu1126137994