2012-03-17 349 views
5

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

+0

这取决于。你在说什么确切的处理器? IIRC 8086有一个16位数据总线。许多较新的型号(奔腾及以上)都有一个64位FSB。 – harold 2012-03-17 14:49:44

+0

@harold:你可以让我知道它对于不同的处理器有何不同。我一般会问,而不是针对任何处理器。它将如何完成说8088有16位数据总线,以及如何为32位数据总线和64位?谢谢 – mezda 2012-03-17 14:54:18

+0

它比简单的数据总线复杂得多,还有缓存 – 2012-03-17 14:56:54

回答

5

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缓存中。

4

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

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

这是20世纪70年代后期以来作为微型计算机(例如DEC VAX)存在的硬件,仍作为微处理器(x86,ARM,Cortex-A8,MIPS32)以及某些微控制器(例如ARM,Cortex- M3,PIC32等)。

最简单的情况:地址总线是一组将地址信号传送到存储器的信号(线),再加上一些信号来传送存储器是从“读出”还是“写入”(数据方向)以及地址和数据方向线上的信号是否有效。就你的例子而言,可能有32条线路用于传送地址的位模式。

数据总线是第二组电线,用于与内存之间的通信。内存可能会断言一个信号来表示数据是有效的,但它可能只是足够快,一切都“正常”。当处理器将地址写入地址信号时,表示要从存储器中读取数据(数据方向为'读'),存储器将检索存储在该地址的值,并将其写入数据总线信号。处理器(经过适当的延时和信号后)将对数据总线进行采样,这就是它使用的数值。

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

你可以在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来查看其总线周期。