CPU 会不会把数据误认为是冯·诺依曼架构中的指令?

Can the CPU mistake data for instruction in Von Neumann architecture?

由于冯诺依曼模型将指令和数据存储在同一个内存块中,我想知道在获取-解码-执行周期中会发生什么。我特别担心的几点:

  1. IR是否可以接收和存储数据而不是指令?

  2. CPU 会尝试像执行指令一样执行数据吗?

  3. 会有什么后果?

谢谢!

是的,如果程序中存在逻辑错误,那么它可以轻松获取数据并尝试将其作为指令执行。

根据计算机系统的不同,可能存在针对执行数据的保护措施——通过将数据和代码分开,处理器可以通过地址保护它们。这种保护会强制程序异常停止。

如果不存在此类保护,或者相关数据实际上位于代码部分,那么是的,处理器将尝试将数据作为指令执行。数据通常不会显示为明智的指令,尽管有时它们可​​以执行而不会导致错误或异常,在这种情况下,处理器将继续执行下一个数据并执行它,依此类推。

常见的数据模式包括全 0 和全 1,因此一些处理器(如 RISC V)被设计为使这些模式不合法(导致异常)。

执行数据的结果可能是任何结果——当这种情况发生时,所有的赌注都会消失,但通常程序只会以崩溃结束,尽管它也可能进入无限循环(挂起)或任何其他不可预测的情况行为。

然而,计算机病毒有时会向数据中注入一些恶意代码(因为数据是可变的,而代码不是1)并让处理器执行它——一些缓冲区溢出攻击就是这样做的.我们还要注意,缓冲区溢出是程序中可以被利用的逻辑错误。在缓冲区溢出攻击中,程序正在从外部源读取数据,因此外部源可以向它提供恰好是机器代码指令的数据,并且还向易受攻击的程序提供过多的数据,从而破坏堆栈 return 地址 — return 地址涉及将处理器的控制权转移到另一个内存位置以进一步执行指令。


1让我们反过来——处理器可以将数据写入代码吗?是的,它可以尝试这样做,但由于这个原因,代码通常是写保护的,因此尝试将以异常停止程序。但如果它不受保护,将数据写入代码将破坏代码(除非程序打算进行此类自我修改)。稍后执行该损坏代码的尝试将涉及处理器将数据作为指令执行。