流水线是如何实现的?我们可以读取现代微处理器的固件吗?
How is pipelining implemented? Can we read the firmware of a modern microprocessor?
我的问题有两个相关部分。
首先,大多数现代微处理器都采用流水线和其他方式来更快地执行代码。他们如何实施?我的意思是,是固件还是其他什么?
其次,如果是固件的话,请问我可以读读固件看看代码吗?
抱歉,我对微处理器知之甚少。
处理器设计中的流水线是一个硬件概念;如果指令流在流程和指令流中利用一点并行性,并通过分解逻辑中的关键路径,指令流可以执行得更快。在硬件中,对于给定的设计(技术上是实现),您只能 "run" 它这么快;即信号通过所有逻辑传播需要一些时间。在最坏情况下可能花费的最长时间是关键路径,它定义了设计可以 运行 的最大时间(或频率)(这是最大时钟速度的来源)。
现在,在最简单的处理器中处理一条指令可以分为三个主要部分:从内存中取出指令(即fetch),将指令解码成它的部分(decode),以及实际执行指令(execute) ).对于每条指令,它都被提取、解码、执行;然后是下一条指令,然后是下一条指令。
每个阶段的硬件都有一个关键路径,即在最坏情况下可能花费的最长时间(Tmax_fetch
用于获取阶段,Tmax_decode
用于解码,Tmax_exec
执行)。因此,对于没有流水线(或单周期)的处理器,完整处理器的关键路径是所有这些阶段将是这些关键路径的总和(这在实际设计中不一定正确,但我们将使用它作为一个简化的例子),Tmax_inst = Tmax_fetch + Tmax_decode + Tmax_exec
。所以,通过4条指令到运行,需要4 * Tmax_inst = 4 * Tmax_fetch + 4 * Tmax_decode + 4 * Tmax_exec
.
流水线允许我们使用硬件寄存器来分解这些关键路径(与程序员寄存器不同,ARM 中的 r2
就是一个例子),但这些寄存器对固件是不可见的。现在,Tmax_inst
不再是阶段的总和,它现在只是最大阶段的三倍,Tmax_inst = 3 * Tmax_stage = 3 * max(Tmax_fetch, Tmax_decode, Tmax_exec)
因为处理器必须 "wait" 才能在最慢的阶段完成最坏的情况下。现在处理器对于单个指令的速度变慢了,但是由于流水线的原因,我们可以独立地执行这些阶段中的每一个,只要在每个 stsge 中处理的指令之间没有依赖关系(比如分支指令,其中获取stage can't 运行 until the branch is executed).因此,对于四个独立的指令,处理器将只取 Tmax_stage * (3 + 4 - 1)
,因为流水线允许提取第一条指令,然后在提取第二条指令的同时进行解码,依此类推。
这应该有助于更好的 exolain 流水线,但直接回答您的问题:
- 这是一个硬件设计概念,所以在硬件中实现,而不是固件
- 由于是硬件概念,没有固件代码可读。
我的问题有两个相关部分。
首先,大多数现代微处理器都采用流水线和其他方式来更快地执行代码。他们如何实施?我的意思是,是固件还是其他什么?
其次,如果是固件的话,请问我可以读读固件看看代码吗?
抱歉,我对微处理器知之甚少。
处理器设计中的流水线是一个硬件概念;如果指令流在流程和指令流中利用一点并行性,并通过分解逻辑中的关键路径,指令流可以执行得更快。在硬件中,对于给定的设计(技术上是实现),您只能 "run" 它这么快;即信号通过所有逻辑传播需要一些时间。在最坏情况下可能花费的最长时间是关键路径,它定义了设计可以 运行 的最大时间(或频率)(这是最大时钟速度的来源)。
现在,在最简单的处理器中处理一条指令可以分为三个主要部分:从内存中取出指令(即fetch),将指令解码成它的部分(decode),以及实际执行指令(execute) ).对于每条指令,它都被提取、解码、执行;然后是下一条指令,然后是下一条指令。
每个阶段的硬件都有一个关键路径,即在最坏情况下可能花费的最长时间(Tmax_fetch
用于获取阶段,Tmax_decode
用于解码,Tmax_exec
执行)。因此,对于没有流水线(或单周期)的处理器,完整处理器的关键路径是所有这些阶段将是这些关键路径的总和(这在实际设计中不一定正确,但我们将使用它作为一个简化的例子),Tmax_inst = Tmax_fetch + Tmax_decode + Tmax_exec
。所以,通过4条指令到运行,需要4 * Tmax_inst = 4 * Tmax_fetch + 4 * Tmax_decode + 4 * Tmax_exec
.
流水线允许我们使用硬件寄存器来分解这些关键路径(与程序员寄存器不同,ARM 中的 r2
就是一个例子),但这些寄存器对固件是不可见的。现在,Tmax_inst
不再是阶段的总和,它现在只是最大阶段的三倍,Tmax_inst = 3 * Tmax_stage = 3 * max(Tmax_fetch, Tmax_decode, Tmax_exec)
因为处理器必须 "wait" 才能在最慢的阶段完成最坏的情况下。现在处理器对于单个指令的速度变慢了,但是由于流水线的原因,我们可以独立地执行这些阶段中的每一个,只要在每个 stsge 中处理的指令之间没有依赖关系(比如分支指令,其中获取stage can't 运行 until the branch is executed).因此,对于四个独立的指令,处理器将只取 Tmax_stage * (3 + 4 - 1)
,因为流水线允许提取第一条指令,然后在提取第二条指令的同时进行解码,依此类推。
这应该有助于更好的 exolain 流水线,但直接回答您的问题:
- 这是一个硬件设计概念,所以在硬件中实现,而不是固件
- 由于是硬件概念,没有固件代码可读。