15

在阅读ARM核心文档时,我有这个疑问。CPU如何区分读取数据和数据总线,是将其作为指令执行还是作为可以操作的数据执行?

请参阅该文件的摘录 -

“数据通过数据总线进入处理器内核。数据可能是要执行的指令,也可能是数据项。”

提前感谢您启发我!/多发性硬化症

4

6 回答 6

10

简单的答案 - 它没有。机器代码指令只是二进制数,数据也是如此。更复杂的答案 - 您的处理器可能(或可能不)提供内存分段,这意味着尝试执行已指定为数据的内容会导致某种陷阱。这是“分段错误”的含义之一——处理器试图执行一些未被标记为可执行代码的东西。

于 2010-01-07T18:19:01.327 回答
7

每个操作码将包含一个 N 字节的指令,然后期望后续的 M 字节是数据(内存指针等)。因此 CPU 使用每个操作码来确定以下字节中有多少是数据。

当然对于旧处理器(例如旧的 8 位类型,如 6502 等)没有区别。您通常会将程序计数器指向内存中程序的开头,这将引用内存中其他位置的数据,但程序/数据存储为简单的 8 位值。处理器本身无法区分两者。

完全有可能将程序计数器指向被认为是数据的东西,事实上,我记得我的教授在一个旧的大学教程中就是这样做,我们不得不向他指出错误。他的回答是“但那是数据!它不能执行那个!可以吗?”,此时我用有效的操作码填充了我们的数据,以证明它确实可以。

于 2010-01-07T18:11:01.213 回答
3

最初的 ARM 设计有一个用于执行指令的三级流水线:

  1. 将指令提取到 CPU 中
  2. 解码指令以配置 CPU 执行
  3. 执行指令。

CPU 的内部逻辑确保它知道它是在第 1 阶段(即取指令)还是在第 3 阶段(即由于“加载”指令而取数据)取数据。

现代 ARM 处理器具有用于获取指令的单独总线(因此管道在获取数据时不会停止)和更长的管道(以允许更快的时钟速度),但总体思路仍然相同。

于 2010-01-21T18:20:37.857 回答
2

处理器的每次读取都被称为数据提取或指令提取。所有新旧处理器都知道从数据获取中获取指令。从外部你可能会或可能无法分辨,通常除了哈佛架构处理器之外,ARM 不是。我最近一直在使用 mpcore (ARM11),外部接口上有一些位告诉你它是什么类型的读取,主要是为了连接外部缓存,结合你是否有 mmu 的知识并且 L1 缓存打开,您可以从指令中分辨出数据,但这是规则的例外。从内存总线的角度来看,它只是数据位,您不知道指令中的数据,

于 2010-01-10T01:51:19.820 回答
0

我认为这取决于数据在程序中的存储位置以及操作系统支持通知 CPU 是代码还是数据。

与存储变量相比,所有代码都放置在图像的不同部分(以及诸如常量字符串之类的静态数据)。操作系统(和内存管理单元)需要知道这一点,因为它们可以通过简单地丢弃代码并从原始磁盘文件重新加载它来将代码交换出内存(至少 Windows 是这样做的)。

所以,我认为CPU“知道”内存是数据还是代码。毫无疑问,我们现在拥有的现代管道 CPU 也有指令以不同方式读取此内存以帮助 CPU 尽可能快地处理它(例如,代码可能不会被缓存,数据将始终被随机访问,而不是在流中)

仍然可以将程序计数器指向数据,但操作系统可以告诉 CPU 阻止这种情况 - 请参阅 NX 位和 Windows 的“数据执行保护”设置(系统控制面板)

于 2010-01-07T18:21:00.803 回答
-2

所以,我认为CPU“知道”内存是数据还是代码。毫无疑问,我们现在拥有的现代管道 CPU 也有指令以不同方式读取此内存以帮助 CPU 尽可能快地处理它(例如,代码可能不会被缓存,数据将始终被随机访问,而不是在流中)

于 2016-12-02T13:55:38.343 回答