首页 时政热点 科技头条 智能AI 安全攻防 数码硬件 开发者生态 汽车 游戏 社会热点 开源推荐 医疗健康 归档 标签 关于

x86 模拟的祸害

摘要

Welcome to the first feature article on our site. We’re going to cover an ongoing problem with x86 emulation that affects every application that we emulate. This comes down to a single over-arching te...

the memory x86 that model and how this models going
2026-09-18 1 阅读 约5分钟阅读 dagmx
分享:
字号:
欢迎阅读我们网站上的第一篇专题文章。我们将讨论 x86 仿真中持续存在的问题,该问题会影响我们仿真的每个应用程序。这归结为一个具有广泛影响的总体术语;模拟 x86 Total Store Ordering 内存模型 (x86-TSO)。在 ARM 定义的弱排序内存模型上模拟此内存模型的问题是多方面的,涵盖多个问题。我们将在本文中讨论我们可能遇到的所有问题以及我们解决(或在某些情况下无法解决)的方法。给自己准备一份小吃和一杯热饮来享受,这将是一个漫长的过程。 x86-TSO 到底是什么?在深入研究如何解决 x86 内存模型问题之前,我们需要首先讨论它到底是什么。内存模型是系统中内存访问如何相互关联的一组规则。这些规则将规定加载和存储如何在单线程或多线程环境中交互。有一些流行的内存模型在各种形式的硬件中实现,但我们今天关心的两个是 ARM 的宽松(或弱)一致性模型,以及 Total-Store-Ordering 一致性模型的 x86 变体。这两个模型基本上是该范围的两个极端。其中 ARM 最宽松,允许进行重大硬件优化; x86 是最严格的,强制执行非常强的一致性模型,不允许有太多优化空间。讨论内存模型时需要注意的一件事是一致性和原子性之间的区别。虽然这些是相关的,但它们并非在所有情况下都相同,也无法得到保证。解释内存模型差异如何发挥作用的最佳方法是从 x86 如何处理这个问题开始。由于 TSO 在操作方式上非常严格,程序员可以假设当内存存储发生时,系统中的所有其他处理器都可以一致地看到它。这还意味着,当发生内存加载时,“逻辑上”之前的所有存储都将已完成,或者至少是可见的。这符合程序员的期望,您写入内存,它在写入时变得可见,因为这在编程时可以直观地思考。商店有效地订购了负载的可见性,从而命名了模型。它的运作方式有一些细微差别,但并不是绝对有必要理解的。 ARM 的弱内存模型对其操作方式不太直观。默认情况下,ARM 使用的常规内存加载和存储在系统中的处理器之间并不严格一致,从而使 CPU 在大多数时间能够更高效地运行。当执行存储指令时,系统中的其他处理器不会立即看到该内存(高速缓存行)。节省宝贵的功率和效率,因为使其他内核的缓存行无效或允许它们窥探另一个处理器的缓存的硬件成本很高。相关地,如果一个处理器正在从另一个处理器已写入的内存加载数据,则不能保证该加载甚至会看到此更新的内存。这听起来像是会在多线程应用程序中引起一些重大问题,对吧?旧版本的 ARM(ARMv7 及更早版本)使用内存屏障指令来确保排序,这对性能有显着影响。为了解决一致性的限制,ARM 还引入了加载-获取和存储-释放内存指令。在 C++ 中,这分别映射到 std::atomic 的 memory_order_acquire 和 memory_order_release 定义。在 ARM 的术语中,这些指令在技术上也不被视为原子操作,但程序员将两者混为一谈。 FEX 使用术语原子加载和原子存储来表示相同的事情!这种区别通常并不重要,但在讨论这些话题时最好迂腐一些。这些指令的主要用例是强制这些指令类之间的内存排序。 ARM 将此称为“发布一致性顺序一致 (RCsc)”模型。在不深入了解该模型如何运行的情况下,基本要点是加载获取指令必须按顺序观察而无需重新排序,并且存储释放指令也必须同时满足“障碍排序之前”语义。删除旧版 ARM 架构版本中所需的昂贵内存屏障指令。 ARMv8.0-a 的卑微开端 这是我们在模拟 x86-TSO 内存模型时从 ARMv8.0-a 开始的前提。我们将所有 x86 内存加载转为 ARM 的加载获取指令,并将 x86 内存存储转为存储释放指令。这实际上为 FEX 提供了与 x86 相同的内存语义,尽管我们实际上比必要的更严格。这是因为我们没有与行为完全匹配的中间立场
这篇文章对您有帮助吗?

订阅66必读

每日精选科技资讯,直达你的邮箱