C 如何从RAM获取数据?

C 如何从RAM获取数据?,c,memory,x86,ram,C,Memory,X86,Ram,在C语言中,每个字节都可以单独寻址。假设一个整数(例如使用4个字节)有一个地址0xaddr(即32位,假设我们有一个32位处理器,具有32位地址总线和32位数据总线),并假设整数的值为0x12345678。现在,如果我从内存中提取这个值,处理器是如何做的?处理器是否将0xaddr(32位地址)放在地址行上,然后提取8位数据,比如0x12。然后处理器将在地址行上设置0xaddr+1的速度,然后为整数的4个字节获取另一个8位数据0x34,依此类推?或者处理器只是放置0xaddr并一次读取4个字节,从

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

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

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

这类硬件自20世纪70年代末以微型计算机(如DEC VAX)的形式存在,现在仍以微处理器(x86、ARM、Cortex-A8、MIPS32)和一些微控制器(如ARM、Cortex-M3、PIC32等)的形式存在

最简单的情况是: 地址总线是一组将地址信号传输到内存的信号(导线),再加上几个信号,用于通信内存是“读取”还是“写入”(数据方向),以及地址和数据方向导线上的信号是否有效。在您的示例中,可能有32条导线承载地址的位模式

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

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

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

你可以看到一个例子,这种信号设置在 该芯片只有24位地址总线和16位数据总线。 它有两个信号(UDS和LDS),用于指示是否正在使用上层数据信号、下层数据信号或两者

我在research.cs.tamu.edu/prism/touchts/mbsd/mbsd_l15.pdf上找到了一个相当详细的解释 我通过搜索“68000内存总线周期”发现了这一点

您可以通过查找MIPS、ARM或x86来查看它们的总线周期。

由描述内存访问(特别是在x86-当前PC-系统中)的GNU C库负责人提供。它比你可能需要的要详细得多

整篇文章分为多个部分:

  • 对于gbulmer的回答,我想补充一点,就是在许多系统中,获取数据流的速度比获取单个单词的速度要快。换言之,选择要读取的位置需要一些时间,但选择的位置,从该点读取,然后是下一个32位或64位或其他位,然后是下一个。。。比切换到某个未连接的位置并读取另一个值要快


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

    这取决于它。你说的是哪个处理器?IIRC 8086有一条16位数据总线。许多较新的型号(奔腾和更高版本)都有64位FSB。@哈罗德:你能告诉我不同的处理器有什么不同吗。我问的是一般情况,而不是特定于任何处理器。比如说FO8086,它有16位数据总线,32位数据总线和64位数据总线是如何实现的?thanksit比简单的数据总线复杂得多,还有cache@KarolyHorvath:你能解释一下吗?或者给我指一篇能回答这个问题的文章?