理论上,有没有办法在RAM中执行任何计算,使用与move
,clflush
等内存相关的指令,例如两个相邻行之间的xor
示例
由于我对RAM和装配的了解有限,我想不出任何这样的可能性。
答案 0 :(得分:5)
不,任何计算都在CPU(或GPU,或其他可以加载/存储到RAM的系统设备)中完成。甚至@PaulR在注释中链接的Turing-complete mov stuff只是使用CPU的地址生成硬件和寄存器中的数据来进行计算。
当CPU缓存未命中时,内存仍会看到64B突发加载和64B突发存储。
有关DDR协议如何工作的一些背景信息,请参阅What Every Programmer Should Know About Memory(发送地址,然后向RAM传输数据脉冲串)
相关:is num++
atomic in C, or with x86 inc [mem]
?
lock inc [mem]
实际上在CPU内部实现了一个加载/修改/存储,CPU使看起来原子到系统中所有可能的其他观察者(例如其他CPU核心和PCIe)设备)。但是不包括将逻辑分析器连接到内存总线之类的东西,这不符合CPU内核在执行原子读取 - 修改 - 写入时用来保存缓存行的独占权的缓存一致性协议。 / p>
有些人认为添加是在内存芯片“内部”完成的,但它们是错误的。 DRAM芯片(或连接到DDR4总线的接口芯片)中没有加法器,甚至布尔AND / OR / XOR硬件;它所能做的只是从给定的地址加载或存储。任何可以做得更多的芯片不仅仅是DRAM。
显然存储器接口芯片中存在逻辑,但它并没有连接到数据上。
如果确实有,那将是Computational RAM的类型。 (感谢在评论中链接,BTW。有趣的计算机架构理念。但AFAIK,没有主流CPU或GPU使用C-RAM。)
你甚至不能要求DDR4 DRAM将页面归零。 CPU必须通过内存控制器来实现。
答案 1 :(得分:4)
令人惊讶的是,根据Paul R的评论:mov
is Turing complete。
然而,这种仅mov
的计算机将是(高度)不切实际的。 更不用说为它编写编译器会非常困难。有一个c编译器可以翻译general purpose c programs into x86 mov
instructions。令人惊讶的是它确实允许浮点计算
因为它基于图灵机,而不是冯·诺依曼计算机,所以速度非常慢,(但这是混淆代码的好方法:-1)。
出于所有实际目的,您只能通过寄存器进行计算
仅AFIAK movs
需要2个存储器操作数,访问存储器的每个其他指令另外使用常量或寄存器操作数。
Rowhammer不是一种计算机制,因为它是非确定性的 它也是实现dram的方式的一个人工制品,缓存不受此影响。