【问题标题】:How is data from the RAM fetched?如何从 RAM 中获取数据?
【发布时间】:2012-03-17 14:41:23
【问题描述】:

在 C 中,每个字节都是可单独寻址的。假设一个整数(比如说它使用 4 个字节)有一个地址 0xaddr(这是 32 位,假设我们有一个 32 位处理器,具有 32 位地址总线和 32 位数据总线)并假设整数的值是 @ 987654323@。现在,如果我从内存中获取这个值,处理器是如何做到这一点的?处理器是否将0xaddr(32 位地址)放在地址线上,然后获取 8 位数据,比如0x12。然后处理器将在地址线上调整0xaddr+1,然后获取另一个 8 位数据0x34,依此类推以获得 4 个整数字节?还是处理器只是放置0xaddr 并一次读取 4 个字节,从而利用其完整的 32 位数据总线?

【问题讨论】:

  • 视情况而定。您在说哪个确切的处理器? IIRC 8086 有一个 16 位数据总线。许多较新的型号(奔腾及更高版本)具有 64 位 FSB。
  • @harold : 你能告诉我它对于不同的处理器有什么不同吗?我问的是一般性问题,而不是特定于任何处理器。 8086 有 16 位数据总线,32 位数据总线和 64 位数据总线如何?谢谢
  • 它比简单的数据总线复杂得多,还有缓存
  • @KarolyHorvath : 你能解释一下或者给我一些可以回答这个问题的文章吗?

标签: c memory x86 ram


【解决方案1】:

This is a well known article 由 GNU C 库负责人编写,描述了内存访问(特别是在 x86 - 当前 PC - 系统中)。它比您可能需要的详细得多。

整篇文章分布在很多部分:

  1. Introduction
  2. CPU Caches
  3. Virtual Memory
  4. NUMA Support
  5. Programmers
  6. More Programmers
  7. Performance Tools
  8. Future
  9. Appendices

我要添加到 gbulmer 的答案中的一件事是,在许多系统中,获取数据流的速度比获取单个单词所期望的要快。换句话说,选择要读取的位置需要一些时间,但是您已经选择了一个,从该点读取,然后是下一个 32 或 64 或任何位,然后下一个...比切换到更快一些未连接的地方并读取另一个值。

主导现代编程的不是从主板上的内存中获取数据的行为,而是数据是否在 cpu 缓存中。

【讨论】:

    【解决方案2】:

    如果您在网上搜索“计算机架构”,您可能会得到一些问题的答案。

    对于您的具体问题,一台具有 32 位数据和地址总线的 32 位计算机,对于一个简单的情况,没有混淆硬件。它将从 32 位宽的内存中读取 32 位。

    这是自 1970 年代后期以来作为小型计算机(例如 DEC VAX)而存在的那种硬件,并且仍然作为微处理器(x86、ARM、Cortex-A8、MIPS32)和某些微控制器(例如 ARM、Cortex-M3)内部存在、PIC32 等)。

    最简单的情况: 地址总线是一组信号(线),它们将地址信号传送到内存,再加上一些信号来传达内存是“读取”还是“写入”(数据方向),以及地址和数据方向线是有效的。在您的示例中,可能有 32 根线来承载地址的位模式。

    数据总线是第二组线路,用于将值与内存进行通信。内存可能会断言一个信号表明数据有效,但它可能足够快,以至于一切都“正常工作”。

    当处理器将地址放在地址信号上,表示它要从内存中读取(数据方向为“读取”),内存将检索存储在该地址的值,并将其放在数据总线信号上。处理器(在适当的延迟和信号之后)将对数据总线线路进行采样,这就是它使用的值。

    处理器可能会读取整个 32 位,并在内部提取一个字节(如果这是指令所需的全部),或者外部地址总线可能会提供额外的信号,以便构建外部存储器系统以提供适当的字节,双字节或四字节值。多年来,ARM 处理器架构的版本只能读取整个 32 位,而更小的部分,例如一个字节,是在内部提取的。

    您可以在http://www.cpu-world.com/info/Pinouts/68000.html 看到此类信号集的示例 该芯片只有一个 24 位地址总线和一个 16 位数据总线。 它有两个信号(UDS 和 LDS),分别指示是否正在使用高位数据信号、低位数据信号或两者。

    我在 research.cs.tamu.edu/prism/lectures/mbsd/mbsd_l15.pdf 找到了相当详细的解释 我是通过搜索“68000 memory bus cycle”找到的。

    您可能有用地寻找 MIPS、ARM 或 x86 来查看它们的总线周期。

    【讨论】:

      猜你喜欢
      • 2019-12-02
      • 2022-07-02
      • 1970-01-01
      • 1970-01-01
      • 2020-07-26
      • 1970-01-01
      • 2010-11-15
      • 2014-05-22
      • 2018-07-14
      相关资源
      最近更新 更多