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 执行(安全)? 的相关文章

  • 汇编器8086将32位数字除以16位数字

    我尝试将 32 位数字除以 16 位数字 例如 10000000h 除以 2000h 根据我尝试做的设计除以 右 4 位数字除以除数 然后左 4 位数字除以除数 这是我的代码 DATA num dd 10000000h divisor dw
  • Android向后兼容技术

    我现在在开发基于最新 API 15 ICS 的 15 项活动 Android 应用程序方面取得了进展 现在我发现应用程序的主要功能主义者即使支持 android v4 也不向后兼容 例如 1 fragment事务动画 2 将StringSe
  • 调用可以是 cdecl 或 stdcall 的函数

    我需要编写调用外部函数的代码 该函数可以是 32 位 Windows 应用程序中的 stdcall 调用或 cdecl 我的代码 调用者 无法提前知道其中的哪一个 现在 如果我尝试从定义为 stdcall 的调用站点调用 cdecl 函数
  • 在 Intel x86 架构上使用非 AVX 指令移动 xmm 整数寄存器值

    我有以下问题 需要使用 AVX2 以外的任何工具来解决 我有 3 个值存储在 m128i 变量中 不需要第四个值 需要将这些值移动 4 3 5 我需要两个功能 一个用于按这些值进行右逻辑移位 另一个用于左逻辑移位 有谁知道使用 SSE AV
  • Android NDK 代码中的 SIGILL

    我在市场上有一个 NDK 应用程序 并获得了有关以下内容的本机崩溃报告 SIGILL信号 我使用 Google Breakpad 生成本机崩溃报告 以下是详细信息 我的应用程序是为armeabi v7a with霓虹灯支持 它在 NVIDI
  • 学习 (N)ASM 的最佳资源是什么? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想学习汇编已经有一段时间了 尽管我之前尝试过几次 但我还没有真正能够超越 Hello world 有
  • 在 x86 程序集中打印寄存器值的简单方法

    我需要在 8086 Assembly 中编写一个程序 接收来自用户的数据 进行一些数学计算并在屏幕上打印答案 我已经编写了程序的所有部分并且一切正常 但我不知道如何打印号码显示到屏幕上 在我所有计算结束时 答案是 AX 它被视为无符号 16
  • 如何计算汇编中的内存位移?

    我一直在研究 yasm 汇编语言 并生成了一个包含以下内容的列表文件 我需要帮助理解第一列中的内存位移是如何计算的 提前致谢 1 line 1 1 memory asm 2 section data 3 00000000 04000000
  • 使用 ACPI 在 MS-DOS 中关闭计算机

    我在基于 Pentium 的计算机上运行 MS DOS 6 22 主板支持 ACPI 并且想知道是否有一个可以用来关闭计算机的汇编语言例程 或者它是否比那个更难 即主板 具体的 基本上 我想创建一个小程序来从命令行关闭计算机 这是专门为此编
  • 如何反汇编、修改然后重新组装 Linux 可执行文件?

    无论如何 这可以做到吗 我使用过 objdump 但它不会产生我所知道的任何汇编器都可以接受的汇编输出 我希望能够更改可执行文件中的指令 然后对其进行测试 我认为没有任何可靠的方法可以做到这一点 机器代码格式非常复杂 比汇编文件还要复杂 实
  • x86 程序集 Pushl/popl 不适用于“错误:后缀或操作数无效”

    我是汇编编程的新手 正在努力解决编程基础 http savannah nongnu org projects pgubook 在带有 GNU 汇编器 v2 20 1 的 Ubuntu x86 64 桌面上 我已经能够汇编 链接执行我的代码
  • 为什么 LED 保持亮起而不是闪烁?

    这是使用 pic16f676 中的 TIMER0 中断使 LED 闪烁的 MPASM 代码 端口 A 的引脚 0 RA0 未切换至关闭位置 请帮忙 我是图片组装的新手 我想掌握图片 有没有高手帮我学习一下 我需要以 1 秒的间隔眨眼 代码是
  • movsbl指令的作用是什么? [复制]

    这个问题在这里已经有答案了 我在网上搜索过 但找不到明确的示例来理解该指令的作用 因此 如果有人可以举一个例子 这对我来说将会非常有帮助 用符号从字节扩展到长字移动 在Intel语法中 该指令的助记符是MOVSX 当变量类型为 C 时 C
  • QNX 6.5.0(SP1) 和 6.6.0(向后兼容)有什么区别?

    找不到指出 QNX 6 5 1 和 6 6 0 之间确切区别的实际发行说明 我知道 Photon 不再受支持 到目前为止 我已经有了 SDP 6 6 0 但我可能还需要我的软件在 6 5 0 上运行 那么 6 5 0 的实际向后兼容性级别是
  • 如何恢复 x86-64 寄存器保存约定

    fibonacci cmpq 1 rdi ja recursive movl 1 eax ret recursive push rbp push r10 movq rdi r10 leaq 2 rdi rdi call fibonacci
  • 测试 xmm/ymm 寄存器是否为零的更快方法?

    It s fortunate that PTEST does not affect the carry flag but only sets the rather awkward ZF also affects both CF and ZF
  • 在现代 x86-64 上计算 64 位整数的整数 Log10 的最快方法是什么?

    标题 我找到了大量 32 位示例 但没有找到完整的 64 位示例 使用这个帖子 https codegolf stackexchange com questions 47290 fastest way to compute order of
  • 在共享库中不使用 PLT 的情况下调用另一个目标文件中的函数?

    我有两个汇编代码 code1 s and code2 s我想从这两个构建一个可重定位 使用 fPIC 开关 共享库 I want code2 s调用一个函数 名为myfun1 其定义在code1 s 当我使用call myfun1 PLT
  • 处理器在操作码​​和数据之间有何不同? [复制]

    这个问题在这里已经有答案了 我正在尝试编写一个反汇编程序 我想知道处理器如何区分操作码和数据字节 例如 这是 Hello World 的字节表示 0x48 0x65 0x6c 0x6c 0x6f 0x20 0x57 0x6f 0x72 0x
  • 编写支持 iOS 3.1.3 和 iOS 4.x 的 iOS 应用程序时的陷阱

    我想编写一个可以在 iOS 3 1 3 到 iOS 4 1 上运行的应用程序 我知道如何设置部署目标和基础 SDK 阅读 Apple 文档后 它很大程度上依赖于检查类是否可用和 或实例是否响应特定选择器 现在我的问题是 如果 Apple 从

随机推荐

  • 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 机