Multithreading rdtsc是否可以轻松修补?

Multithreading rdtsc是否可以轻松修补?,multithreading,assembly,time,rdtsc,Multithreading,Assembly,Time,Rdtsc,在多核处理器出现之前的时代,很多很多程序都使用rdtsc指令来获取精确的数据 这在多线程程序中是一个严重的问题,因为它们可能以冲突的值结束,许多程序因此彻底崩溃(一些单线程程序也可能崩溃,具体取决于它们如何使用rtdsc) 至少在Windows上,通常建议只设置“处理器亲和力”,不幸的是,这也严重削弱了一些设计(显然不正确)为使用并行性的程序 所以我在想,即使没有任何类型的源代码,在粗糙的程序中查找rdtsc调用并用其他东西替换它有多难?(我不知道还有什么是…一般来说,如果有人递给你一个机器代码

在多核处理器出现之前的时代,很多很多程序都使用rdtsc指令来获取精确的数据

这在多线程程序中是一个严重的问题,因为它们可能以冲突的值结束,许多程序因此彻底崩溃(一些单线程程序也可能崩溃,具体取决于它们如何使用rtdsc)

至少在Windows上,通常建议只设置“处理器亲和力”,不幸的是,这也严重削弱了一些设计(显然不正确)为使用并行性的程序


所以我在想,即使没有任何类型的源代码,在粗糙的程序中查找rdtsc调用并用其他东西替换它有多难?(我不知道还有什么是…

一般来说,如果有人递给你一个机器代码二进制文件,你可能会非常(图灵!)难以确定哪些字节是指令,哪些是代码。如果您不能正确地执行此操作,您甚至无法找到RDTSC指令进行修补。(更糟糕的是:一些程序会生成代码;现在数据区域中的内容是运行时可能暂时包含RDTSC)。在真正特殊的程序中,有些指令可能会与其他指令重叠,导致一些JMPS真正地落在被识别为长指令的中间。(x86指令可能有16字节长!)

二进制逆向工程的人有这个问题。总的来说,我不知道他们是如何成功的。我怀疑这是因为大多数程序目标代码都是由不想隐藏任何内容的编译器生成的(当遇到这样的编译器时要小心)

如果你能找到它们,我假设你会用一个函数调用一个例程来替换它们,该例程将一个已知常量加载到寄存器中,以避免你建议的不一致性问题。修补他们的位置可能会很尴尬;RDTSC(我认为)是2个字节,它们可能夹在另外两条由于某种原因无法移动的指令之间。因此,您可能被迫在每个RDTSC上只使用一个断点(1字节)来捕获RDTSC模拟器;如果有人 正在使用RDTSC读取定时环路中的纳秒时钟信号


总而言之,这似乎是一条艰难的道路。你有多想运行真正的旧程序,为什么?

一般来说,如果有人递给你一个机器代码二进制文件,你可能会非常(图灵!)难以确定哪些字节是指令,哪些是代码。如果您不能正确地执行此操作,您甚至无法找到RDTSC指令进行修补。(更糟糕的是:一些程序会生成代码;现在数据区域中的内容是运行时可能暂时包含RDTSC)。在真正特殊的程序中,有些指令可能会与其他指令重叠,导致一些JMPS真正地落在被识别为长指令的中间。(x86指令可能有16字节长!)

二进制逆向工程的人有这个问题。总的来说,我不知道他们是如何成功的。我怀疑这是因为大多数程序目标代码都是由不想隐藏任何内容的编译器生成的(当遇到这样的编译器时要小心)

如果你能找到它们,我假设你会用一个函数调用一个例程来替换它们,该例程将一个已知常量加载到寄存器中,以避免你建议的不一致性问题。修补他们的位置可能会很尴尬;RDTSC(我认为)是2个字节,它们可能夹在另外两条由于某种原因无法移动的指令之间。因此,您可能被迫在每个RDTSC上只使用一个断点(1字节)来捕获RDTSC模拟器;如果有人 正在使用RDTSC读取定时环路中的纳秒时钟信号


总而言之,这似乎是一条艰难的道路。您有多希望运行非常旧的程序?为什么?

到底是什么问题?多个线程获得相同的时间戳,但程序逻辑假设它可以使用时间戳作为唯一ID?或者,您是在讨论从一个核心迁移到另一个核心后比较时间戳的问题吗?第二个问题可以通过将每个线程固定到它们自己的核心来解决,这不会影响并行性(很大程度上取决于设计)
rdtsc
只是一个2字节的指令,因此没有太多的空间将其二进制修补到任何有用的地方。如果该程序是在多核处理器出现之前的时代创建的,那么它可能不是为了有效地使用多核处理器而设计的。这比仅仅创建一堆线程来做随机的事情要困难得多,这是当时大多数程序员的想法。如果这些有缺陷的程序在多CPU(每个插槽一个)系统上开发的过程中的任何时候都被测试过,那么RDTSC的缺陷就会暴露出来。这样一个程序不太可能因为被限制在一个CPU上而遭受那么多的损失,因为事实上这正是它们的设计目的。因此,在2个处理器内核是一种奢侈品的时代编写的软件受到仅支持32个内核的操作系统功能的限制。嗯,想想这个很有趣,但这并不是一个“严重的问题”。我相信这会发生,但在今天仍然重要的程序中不会发生。顺便说一句,我主要谈论的是游戏(虽然一些旧的服务器相关软件也有问题,但这是我如何发现缺陷存在的,当我试图修复我正在开发的游戏时,我发现一些IBM在他们的服务器上谈论这个问题)。但许多旧游戏使用RTDSC来跟踪时间,例如,查看上次物理计算以来经过了多少时间,因此他们可以使用物理公式,如位置=旧位置+速度*时间,RTDSC的问题是,这可能导致时间为零或负,有时导致被零除,物理向后移动