当前位置: 首页 > 知识库问答 >
问题:

MSROM程序中的条件跳转指令?

吕自怡
2023-03-14

这与这个问题有关

想想看,在现代英特尔中央处理器上,证券交易委员会阶段是在微码中实现的,这意味着将有一个检查,通过该检查,一个烧毁的密钥被用来验证PEI ACM上的签名。如果它不匹配,那么它需要做一些事情,如果它匹配,它需要做其他事情。鉴于这是作为MSROM过程实现的,必须有一种分支方式,但鉴于MSROM指令没有RIP。

通常,当分支误预测为被采用时,则当指令失效时,ROB将检查异常代码,并因此将指令长度添加到ROB行的RIP中,或者仅使用下一个ROB条目的IP,这将导致前端在分支预测更新中被重定向到该地址。有了BOB,这个功能现在已经被借给跳转执行单元了。显然,这不会发生在MSROM例程中,因为前端与它无关。

我的想法是,有一个特定的跳转指令,只有MSROM例程可以发出该指令,跳转到MSROM中的不同位置,它生成一个异常代码,并可能将特殊的跳转目标连接到它,然后在退役时发生异常。或者,执行单元可以处理它,它可以使用BOB,但我的印象是BOB是由分支指令RIP索引的,然后还有一个事实,即生成MSROM代码的异常通常在退役时处理;分支预测失误不需要MSROM,我认为所有操作都是在内部执行的。

共有3个答案

宋唯
2023-03-14

我现在知道的是,MSROM静态预测分支,并在下一个IP逻辑中为下一个微码行使用该预测。这些预测可能已经在MSROM中存储的UOP中提供。

对于更小、更频繁的MSROM例程,复杂解码器可以在将控制传递给MSROM以完成解码之前发出1-4个uop。否则,它会延迟地将控制传递给MSROM。

在优选实施例中,一些更频繁使用的宏指令被XLAT PLA 510-516解码成微操作序列中的一个、两个、三个或四个第一Cuops,这以XLAT PLA 510-516中额外的最小项为代价提供了高性能。或者,对于一些不常用的宏指令,四个XLAT PLA 510-516不发出cuop,而只是允许MS单元534发出所有的cuop。第二种选择的缺点是html" target="_blank">性能较低(即损失至少一个时钟周期),但可以节省XLAT PLA 510-516中的最小项(条目),这是一种以较低性能为代价减少管芯空间的设计折衷。这种折衷对于不经常使用的指令或长微码流是有用的,在这种情况下,一个附加时钟的重要性降低了。

来自宏指令502的操作码被提供给入口点PLA 530,PLA 530对操作码进行解码以生成进入微码ROM的入口点地址。生成的入口点地址被提供给MS单元534,该单元响应于入口点,生成一系列Cuop。MS单元534包括一个微码ROM(“UROM”),该微码例程包括为长指令流提供UROM Cuops的微码例程,在某些示例中可能需要超过一百个UROM Cuops。UROM 还包括辅助处理例程和其他微码。

其余的在这里回答:https://stackoverflow.com/a/65796517/7194773

魏誉
2023-03-14

英特尔为微码的一些非常类似汇编的功能申请了专利,其中包括:

执行从L1,L2或L3(!!!!!!!!!!!!!!!!!!!!!!!).见鬼,他们申请了专利,将“大”微码更新从大容量存储加载到L3,然后从那里更新...-请注意,“已申请专利”和“已实施”是不同的,我不知道他们目前是否实施了除了在L1执行之外的任何其他内容。

Opcode和Ucode(!)MCU包中的部分(统一微处理器更新)——我们称之为“微码更新”,但实际上有/可以有各种内容,包括PMU固件更新、MCROM补丁、非核心参数更改、PWC固件等,这些内容在处理器固件/ucode更新程序之前/之后执行。

类似子程序的行为,包括Ucode上的参数。条件分支,或者至少条件循环,他们已经有一段时间了。

微码的压缩和解压缩(不知道它是否可以直接从压缩状态“运行”,但专利似乎暗示它至少会用于优化MCU包)。

和WRMSR/RDMSR实际上更像是一个进入Ucode的RPC,而不是现在的任何其他东西,我想当他们发现他们需要一个新的MSR,或者对一个架构MSR行为进行复杂的更改时,这真的很有帮助(就像LAPIC基址寄存器,它必须被“gatekeeped ”,以绕过几年前成为新闻的LAPIC内存漏洞SMM安全漏洞)。

所以,就把它看成一个硬件加速的图灵完全RISC机器,实现“公共”指令架构。

岑毅庵
2023-03-14

微码分支显然是特殊的。

根据Andy Glew对原始P6的描述,Intel的P6和SnB系列不支持微码分支的动态预测(REP做什么设置?)。考虑到SnB系列rep-string指令的类似性能,我认为这个PPro事实甚至适用于最新的Skylake/CoffeeLake CPU1

但是微码分支预测失误会受到惩罚,所以它们是静态的(?)预测。(这就是为什么rep-movsb启动成本在ECX中的低/中/高计数以5个周期为增量,对齐与未对齐。)

微代码指令在微操作缓存中取一整行给自己。当它到达IDQ的前端时,它接管发布/重命名阶段,直到它完成发布微码微操作。(另请参阅在一个指令周期中微码是如何执行的?有关更多详细信息,以及来自perf事件描述(如< code>idq.dsb_uops)的一些证据,这些证据显示,当发布/重命名阶段从微码定序器中读取时,idq可以从uop缓存中接受新的UOP。)

对于rep-string指令,我认为循环的每次迭代都必须通过前端发出,而不仅仅是在后端内部循环并重用这些uop。所以这涉及来自OoO后端的反馈,以确定指令何时完成执行。

我不知道当问题/重命名切换到从MS-ROM而不是IDQ读取uop时会发生什么细节。

尽管每个uop都没有自己的RIP(作为单个微码指令的一部分),我猜分支预测失误检测机制的工作原理与正常分支类似。

rep-movs某些CPU上的设置时间似乎以5个周期为一步,具体取决于具体情况(小与大、对齐等)。如果这些是来自微码分支预测失误,那么这似乎意味着预测失误的惩罚是固定的周期数,除非这只是rep-movs的特殊情况。可能是因为OoO后端可以跟上前端?从MS-ROM中读取比从uop缓存中读取更能缩短路径,从而使未命中惩罚更低。

有趣的是,我们可以围绕< code>rep movsb进行一些实验,看看OoO exec能实现多少功能,例如,使用两个相关的< code>imul指令链,看看它是否能像< code>lfence一样(部分)序列化它们。我们希望不会,但是为了实现ILP,后面的< code>imul微操作必须在不等待后端清空的情况下发出。

我在天湖(i7-6700k)上做了一些实验。初步结果:95字节及以下的拷贝大小很便宜,并且被IMUL链的延迟所隐藏,但它们基本上完全重叠。96字节或更大的拷贝大小会耗尽RS,从而串行化两个IMUL链。无论是rep-movsb(RCX=95 vs.96)还是rep-movsd

“排空 RS”行为是用 rs_events.empty_end:u 甚至变成每代表 1 个 movsb 而不是 ~0.003 来测量的。other_assists.any:u是零,所以它不是“助攻”,或者至少不算作助攻。

如果微码分支不支持通过BoB进行快速恢复,那么无论uop涉及到什么,都可能只是在达到退休时检测到错误预测?96字节阈值可能是某些替代策略的截止值。RCX=0也会耗尽RS,大概是因为这也是一种特殊情况。

使用rep-scas(它没有快速字符串支持,只是一个缓慢而愚蠢的微码)进行测试会很有趣

英特尔1994年的快速字符串专利描述了在P6的实施。它没有IDQ(所以在阶段之间有缓冲区的现代CPU和uop缓存会有一些变化是有道理的),但他们描述的避免分支的机制很简洁,可能仍然用于现代ERMSB:第一个< code>n复制迭代是后端的谓词UOP,所以它们可以无条件地发出。还有一个微操作,它使后端将它的ECX值发送给微码定序器,后者使用该值在此之后准确地反馈额外的复制迭代次数。只有复制微操作(可能还有ESI、EDI和ECX的更新,或者可能只有在中断或异常时才这样做),而不是微码分支微操作。

这个初始的nuop vs.在阅读RCX后输入更多可能是我看到的96字节阈值;它带有一个额外的idq.ms_switches:uperrep movsb(从4到5)。

https://eprint.iacr.org/2016/086.pdf表明微码在某些情况下可以触发辅助,这可能是更大副本大小的现代机制,并解释了耗尽RS(显然还有ROB)的原因,因为它仅在uop提交(退役)时触发,因此它就像一个没有快速恢复的分支。

执行单元可以通过将事件代码与微操作的结果相关联来发出辅助或发出故障信号。提交微操作时 (§ 2.10),事件代码会导致无序调度程序压缩 ROB 中所有正在进行的微操作。事件代码被转发到微码排序器,后者在相应的事件处理程序中读取微操作”

这与 P6 专利的区别在于,这种辅助请求可以在后续指令中的一些非微码 uop 已经发出后发生,因为预计微编码指令仅使用第一批 uop 完成。或者,如果它不是微码批处理中的最后一个 uop,则可以像分支一样使用它来选择不同的策略。

但这就是为什么它必须冲洗ROB。

我对 P6 专利的印象是,对 MS 的反馈发生在从后面的指令中发出 uops 之前,以便在需要时及时发布更多的 MS uops。如果我错了,那么也许它已经是2016年论文中仍然描述的相同机制。

通常,当一个分支错误地预测被采用时,当指令退休时,

自Nehalem以来,英特尔就有了“快速恢复”,当一个预测失误的分支执行时开始恢复,而不是像例外一样等待它退役。

这就是在通常的ROB失效状态之上有一个分支顺序缓冲区的关键所在,当任何其他类型的意外事件变为非推测性事件时,它允许您回滚。(当skylake CPU错误预测分支时,会发生什么?)

脚注1:IceLake应该具有“快速短rep”功能,这可能是处理rep字符串的不同机制,而不是更改微码。e、 也许像安迪这样的硬件状态机提到他希望自己当初就设计好了。

我没有任何关于性能特征的信息,但是一旦我们知道了一些东西,我们就可以对新的实现进行一些猜测。

 类似资料:
  • 我不知道在哪里使用指令,在哪里使用汇编中的instructions? 从性能来看: 它们有什么区别? 哪一个更好? 如果可能的话,请举例说明它们的区别。

  • 小程序跳转小程序 产品简介 开发者可以通过以下接口帮助用户在小程序之间互相跳转。 使用场景 当开发者拥有多个小程序时,可以通过小程序间互相跳转,完善小程序生态。 开放标准 对所有入驻小程序的企业开放。 打开指定的小程序 开发者可以使用jd.navigateToMiniProgram(OBJECT),打开指定的小程序,帮助用户在小程序之间跳转。 OBJECT 参数说明: 参数名 类型 必填 说明 a

  • 2、条件转移指令(Transfer Conditionally) 条件转移指令是一组极其重要的转移指令,它根据标志寄存器中的一个(或多个)标志位来决定是否需要转移,这就为实现多功能程序提供了必要的手段。微机的指令系统提供了丰富的条件转移指令来满足各种不同的转移需要,在编程序时,要对它们灵活运用。 条件转移指令又分三大类:基于无符号数的条件转移指令、基于有符号数的条件转移指令和基于特殊算术标志位的条

  • 本文向大家介绍汇编语言 跳转指令与C语言的条件分支,包括了汇编语言 跳转指令与C语言的条件分支的使用技巧和注意事项,需要的朋友参考一下 跳转指令 跳转指令也是一个组的指令,称为j组。其中jmp为无条件跳转,其余为条件跳转 上图为j组指令,可结合条件码访问指令加深理解 在机器指令水平上理解如何对跳转指令编码 如上图,通过反汇编软件得到机器指令与汇编语言,其中左边为机器指令编码,右边为对应汇编语言含义

  • 我正在阅读Jeff Duntemann的汇编语言分步,我对一些条件跳转的工作原理感到困惑。我知道用于使用减法比较两个值,然后丢弃结果以设置标志。 有没有办法确定哪些标志需要设置/取消设置?我了解JE和JNE的情况,它查看是否设置了ZF,但我不确定其他分支操作。 这是我被卡住的部分: 如果EDX,为什么JAE会回环

  • 我有个问题,不知道从哪里开始。我想将文件(仅.zip)从windows中的任何位置放入Swing应用程序(放入JList)。我该怎么做? 在列表中,我只显示绝对路径,文件可能是数组或类似的东西。Java 1.6