如何从RAM获取数据?

时间:2012-03-17 14:41:23

标签: c memory x86 ram

在C中,每个字节都是可单独寻址的。假设一个整数(比如使用4个字节)有一个地址0xaddr(假设我们有32位处理器,32位地址总线和32位数据总线,则为32位),并假设整数的值是0x12345678。现在,如果我从内存中获取此值,处理器如何执行此操作?处理器是否在地址线上放置0xaddr(32位地址),然后获取8位数据0x12。然后处理器将在地址线上调整0xaddr+1,然后获取另一个8位数据0x34,依此类推整数的4个字节?或者处理器只是放置0xaddr并一次读取4个字节,从而利用其完整的32位数据总线?

2 个答案:

答案 0 :(得分:6)

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
  10. 我要补充一点,gbulmer的答案是,在许多系统中,获取数据流的速度比获得单个单词的速度要快。换句话说,选择你想要读取的位置需要一些时间,但是你选择了一个,从那一点读取,然后是下一个32或64或任何位,然后下一个...比切换到一些未连接的地方,并阅读另一个值。

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

答案 1 :(得分:4)

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

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

这是自20世纪70年代后期以来作为微型计算机(例如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内存总线周期”。

您可以有效地查找MIPS,ARM或x86以查看其总线周期。

相关问题