Intel TSX 前缀是否在 AMD 上作为 NOP 执行(安全)?

2023-12-09

我有一个在 Intel 和 AMD x86 机器上运行的应用程序的 MASM 同步代码。

我想使用 Intel TSX 前缀(特别是 XACQUIRE 和 XRELEASE)来增强它。

如果我为 Intel 正确修改代码,当我尝试在 AMD 机器上运行它时会发生什么?英特尔表示,这些设计是为了向后兼容,大概意味着它们什么也不做 在没有 TSX 的 Intel CPU 上。

我知道AMD还没有实施TSX。但这些前缀在 AMD CPU 上运行安全吗?这种行为是否记录在 AMD 手册中的某处,或者是否认为这是安全的并且永远是安全的,这是在玩火?


xacquire/xrelease只是 F2/F3 REP 前缀并且是被所有不支持该功能的 CPU 安全地忽略,包括非英特尔。这就是英特尔选择这种前缀编码的原因。它甚至比必须作为单独指令解码的 NOP 更好。

一般来说(跨供应商),CPU 会忽略它们不理解的 REP 前缀。因此,如果新扩展在旧 CPU 上解码为其他内容有用,则可以使用 REP 作为其编码的一部分,而不是#UD.

我认为 AMD 为 引入不兼容的含义是不合理的rep前缀于locked 指令或 mov-stores - 这会破坏已经使用这些前缀的现实世界二进制文件。例如,我非常确定主流 GNU/Linux 发行版中的一些 libpthread 版本已经使用它来启用硬件锁省略,并且不使用动态 CPU 调度来基于 CPUID 运行不同的代码。


之前已经使用 REP 作为向后兼容新指令的强制前缀,例如和rep nop = pause or rep bsf = tzcnt。 (对编译器有用,因为tzcnt在某些 CPU 上速度更快,并且如果已知输入非零,则给出相同的结果。)并且rep ret作为 AMD 预推土机分支预测器的解决方法,被 GCC 广泛使用 -“rep ret”是什么意思?。这个毫无意义的 REP 在 AMD 上的实践中确实有效(默默地被忽略)。

(相反的是not真的。您无法编写依赖于被忽略的无意义 REP 前缀的软件futureCPU。后来的一些扩展可能会给它一个含义,例如喜欢与rep bsr其运行方式为lzcnt并给出不同的结果。这就是为什么英特尔将无意义前缀的影响记录为“未定义”。)


我想使用 Intel TSX 前缀(特别是 XACQUIRE 和 XRELEASE)来增强它。

不幸的是,微代码更新显然禁用了所有 Intel CPU 上 TSX 的 HLE(硬件锁消除)部分。 (也许是为了减轻TAA 侧信道攻击)。这与进行的更新相同jcc在 32 字节块的末尾,在 uop 缓存中是不可缓存的,因此很难通过对现有代码进行基准测试来判断无 HLE 部分对性能有何影响。

https://news.ycombinator.com/item?id=21533791 / 由于 Spectre 缓解措施,硬件锁消除是否会永远消失?(是的,消失了,但不,原因可能不是幽灵。我不知道它是否会回来。)

如果你想在 x86 上使用硬件事务内存,我认为你唯一的选择是 RTM (xbegin/xend),多伦多证券交易所的另一半。在最近的微代码更新后,操作系统也可以禁用它;我不确定典型系统的默认值是什么,并且将来可能会发生变化,因此在将开发时间投入到任何内容之前需要检查这一点。

AFAIK 没有一种方法可以使用 RTM,但可以透明地回退到锁定; xbegin / xend 是非法指令,会导致错误#UD如果 CPUID 功能位不存在。

如果您想要透明的向后兼容,您应该使用 HLE,因此它(以及一般的 TSX)经历了如此艰难的时期,反复被微代码更新禁用,这真是令人遗憾。 (之前在 Haswell 和 Broadwell 中,因为可能存在正确性错误。现在它变成了查理·布朗的情况.)


更新:由于 TAA 等漏洞(https://docs.kernel.org/admin-guide/hw-vuln/tsx_async_abort.html),从 2021 年起,大多数 Skylake 系列 CPU 在微代码中禁用了 TSX(没有 HLE,RTM 总是中止。)https://www.intel.com/content/www/us/en/support/articles/000059422/processors.html

操作系统现在无法在受影响的 CPU 上重新启用 RTM,只能设置一点,以便 CPUID 不会公布现在无用的功能。 (如果有任何 Whiskey Lake、Comet Lake 或 Amber Lake CPU 的步进为 0xD 或 0xE 或更高,则可能有一些后期步进的 CPU 不受 2021 年更新的影响。)

TSX 功能也已从 Ice Lake 中删除。https://en.wikipedia.org/wiki/Transactional_Synchronization_Extensions#History_and_bugs- 显然蓝宝石急流中有一个新的 TSXLDTRK。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Intel TSX 前缀是否在 AMD 上作为 NOP 执行(安全)? 的相关文章

随机推荐

  • C# 解析文本文件并将值存储在数组中

    我正在尝试将具有以下格式的文本文件读入数组 Previous errors were for Test id 1234567 Error id 12345678 Previous errors were for Test id 123456
  • 如何清除实体框架中跟踪的实体

    我正在运行一些在一大堆实体上运行的修正代码 随着它的进展 速度会降低 这是因为上下文中跟踪的实体数量随着每次迭代而增加 这可能需要很长时间 所以我在最后保存更改每次迭代的 每次迭代都是独立的 不会更改先前加载的实体 我知道我可以关闭更改跟踪
  • 从 C# 调用托管 C# COM 对象

    我正在尝试从 C 调用 C COM 对象 我用 C 创建了一个类库 并使用 tlbexe exe 导出了一个类型库 然后我使用 regtlibv12 exe 注册了类型库 但是 当我在 Visual Studio 中添加对 COM 对象的引
  • 使用 array_search 进行多维数组

    在一维数组中使用 array search 很简单 array array apple banana cherry searchValue cherry key array search searchValue array echo key
  • 如何在R编程中读取和解码二维码图像? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 如何在R编程中读取和解码二维码图像 我想将带有二维码的图像转换为文本 R 有用于生成 QR 码的库 如 package qrcode 和 packa
  • eclipse 中junit 的等宽字体?

    如何更改 JUnit 选项卡中的字体 以便它使用等宽字体显示结果 我正在使用 Groovy 我找到了解决方案here 您需要转到 Groovy gt Preferences 并选中使用等宽字体复选框
  • ag-grid v 22.1.1 升级后 ng build --prod 失败

    我已经开始使用ag grid从版本 18 开始 目前为 20 0 0 我正在升级到最新版本 22 1 1 解决由于重大更改而导致的警告 错误后 一切 包括 ng服务 都工作正常 但是 当我尝试在产品模式下构建角度应用程序时 它失败了 app
  • x86-64:规范地址和实际可用范围

    Intel 和 AMD 文档称 对于 64 位模式 实际上只有 48 位可用于虚拟地址 并且从 48 到 63 的位必须复制位 47 符号扩展 据我所知 当前所有的CPU都是以这种方式实现的 但是 理论上 没有什么禁止在未来的实现中扩展可用
  • 如何将jsPDF转换后的pdf文件发送到后端服务器?

    我需要将 png 文件发送到后端服务器 我使用 jsPDF 将其转换为 pdf var doc new jsPDF l mm 210 210 doc addImage myPngData PNG 0 0 210 210 现在我需要使用我的老
  • 如何阅读“fetch(PDO::FETCH_ASSOC);”

    我正在尝试使用 PHP 构建一个 Web 应用程序 并且我正在使用内存缓存用于存储数据库中的用户数据 例如 假设我有以下代码 sql SELECT FROM users WHERE user id user id stmt this gt
  • 从元模型强制执行单个实例

    我知道从类级别确保单个实例要容易得多 而且有很好的StaticishJonathan Stowe 的模块通过使用角色来执行相同的操作 但我只是想尝试更好地理解如何阶级高阶工作可以处理 主要是针对FOSDEM的讲 我可以想到在元模型级别上执行
  • 如何手动轮换 log4j 日志

    我将 log4j 配置为每天轮换日志 在特殊情况下 我想手动触发额外的日志轮换 这可能吗 如果可能的话 如何实现 像这样解决 void rolloverLogs for final Enumeration appenders logger
  • 使用 php-imagick api 将 PDF 转为图像

    我想将 PDF 转换为图像 但是当输出图像生成时 它会比原始图像变得模糊 这是代码 uploadfile pdf 53 img new Imagick uploadfile img gt setResolution 300 300 img
  • Tkinter 将带参数的函数绑定到小部件

    我有一个 tkinter 框架和一个附加到它的按钮 from tkinter import def rand func a b c effects print a b c root Tk frame Frame root frame bin
  • PHP:HTTP 基础 - 注销

    我想将其设置为如果有人发送 注销 请求 它会自动将他们带到一个显示 成功注销 的页面 如果客户尝试按后退按钮或进入受限区域 它将再次要求 HTTP 身份验证 到目前为止我所拥有的是这样的 example com restricted ind
  • Python 中 list.index(x) 的复杂性

    我指的是这个 http docs python org tutorial datastructs html 运行时间是多少list index x Big O 表示法的函数 时间复杂度为 O n 另请查看 http wiki python
  • 检查点是否位于由多个多边形/孔组成的空间对象中

    我有一个 SpatialPolygonsDataFrame 其中包含 11589 个 多边形 类对象 其中 10699 个对象恰好由 1 个多边形组成 但其余对象由多个多边形 2 到 22 组成 如果一个对象由多个多边形组成 则可能出现三种
  • Wix 安装程序包生成损坏的“msi”

    使用非常简单的代码 几乎与示例中相同
  • 在单元测试中使用反射是一种不好的做法吗? [复制]

    这个问题在这里已经有答案了 在过去的几年里 我一直认为在Java中 反射在单元测试中被广泛使用 由于一些必须检查的变量 方法是私有的 因此有必要读取它们的值 我一直以为Reflection API也是用于这个目的的 上周我必须测试一些包 因
  • Intel TSX 前缀是否在 AMD 上作为 NOP 执行(安全)?

    我有一个在 Intel 和 AMD x86 机器上运行的应用程序的 MASM 同步代码 我想使用 Intel TSX 前缀 特别是 XACQUIRE 和 XRELEASE 来增强它 如果我为 Intel 正确修改代码 当我尝试在 AMD 机