【发布时间】:2011-02-13 01:04:58
【问题描述】:
有人可以解释Word 和Byte 可寻址之间的区别吗?它与内存大小等有什么关系?
【问题讨论】:
-
请参阅byte- vs. word-addressing schemes: > 基于字节和字的寻址方案的演示。
标签: memory operating-system cpu-architecture
有人可以解释Word 和Byte 可寻址之间的区别吗?它与内存大小等有什么关系?
【问题讨论】:
标签: memory operating-system cpu-architecture
Memory units 是可寻址。这是我们使用内存的唯一方法。
实际上,内存只是byte addressable。意思是:
a single 字节。 a group of bytes – 2、4、8,具体取决于 数据总线 size of强> CPU。要全面了解memory operation,您必须熟悉CPU的各种寄存器和内存端口RAM 的。我假设您知道它们的含义:
RAM有two种内存端口:
32-bits 用于数据/地址
8-bit 表示 操作码。 假设 CPU 想要从 地址 读取 a word(比如 4 bytes) xyz 以后。 CPU会将地址放在MAR上,发送内存读取信号到内存控制器芯片。在收到地址和读取信号后,内存控制器会将数据总线连接到32-bit port 和 4 bytes 从 address 开始 xyz 将流出 port 到 MDR。
如果CPU想要获取下一个指令,它会将地址放入PC寄存器并向内存控制器发送一个获取信号。在接收到地址并获取信号后,内存控制器会将数据总线连接到8 -bit port 和 a single byte long opcode 位于 address 收到将流出 RAM 进入 CPU 的 MDR。
这就是我们说某个寄存器是内存可寻址或字节可寻址的意思。现在,当您在 MAR 上将 decimal 2 说成 binary 以读取 word 2,而不是 (byte 没有2)?
Word no 2 表示 bytes 4, 5, 6, 7 对于 32-bit 机器。在真实物理内存中只能字节寻址。所以有一个技巧来处理字寻址。
当 MAR 放置在 地址总线 上时,其 32 位不会映射到 32 地址行( 0-31 分别)。相反,MAR bit 0 连接到 地址总线 line 2,MAR bit 1 连接到 地址总线强>line 3等等。 MAR 的上层 2 bits 被丢弃,因为它们仅在 2^32 以上的字地址 中需要,这些对于我们的 32 bit 机器均不合法。
使用这个映射,当 MAR 是 1,address 4 放在 bus 上,当 MAR 是 2,@987654368 @ 放在 bus 上等等。
一开始有点难以理解。我是从Andrew Tanenbaums的结构化computer organisation那里学到的。
【讨论】:
这张图片应该很容易理解: http://i.stack.imgur.com/rpB7N.png
简单地说,
• 在字节寻址方案中,第一个字从地址 0 开始,并且 第二个字从地址 4 开始。
• 在字寻址方案中,第一个字的所有字节都位于 在地址 0 中,第二个字的所有字节都在地址 1 中。
当我们考虑一次处理一个字节的数据的应用程序时,字节寻址能力的优势就很明显了。在字节可寻址系统中访问单个字节只需要发出单个地址。在 16 位字可寻址系统中,首先必须计算包含该字节的字的地址,取出该字,然后从两字节字中提取该字节。尽管字节提取的过程很好理解,但它们的效率低于直接访问字节。因此,许多现代机器都是字节可寻址的。
【讨论】:
可寻址性是具有自己地址的内存单元的大小。它也是您可以在不影响其邻居的情况下修改的最小内存块。
例如:一个机器,其中字节是正常的 8 位,字大小 = 4 字节。如果它是可字寻址的机器,则不存在int 的第二个字节的地址之类的东西。处理字符串(例如 char str[] 之类的数组)变得不方便,因为您仍然将字符存储在一起。仅修改str[1] 意味着加载包含它的单词,执行一些移位/和/或操作以应用更改,然后执行单词存储。
请注意,这与不允许未对齐字加载/存储(字地址的低 2 位必须为 0)的机器不同。此类机器通常具有字节加载/存储指令。我们谈论的是没有那个的机器。
CPU 地址实际上可能仍包含低位,但要求它们始终为零(或忽略它们)。但是,在检查它们是否为零之后,可以将其丢弃,因此内存系统的其余部分只能看到字地址,其中两个相邻字的地址相差 1(而不是 4)。但是,在一个寄存器只能保存 64k 个不同地址的 16 位 CPU 上,您不太可能这样做。每个单独的 CPU 地址将引用不同的 2 字节内存,而不是丢弃低位。 2B 字可寻址内存可以让您寻址 128kiB 的内存,而不仅仅是 64kiB 的字节可寻址内存。
有趣的事实:ARM 过去使用地址的低 2 位作为未对齐字加载的随机控制。 (但它总是有字节加载/存储指令。)
另见:
请注意,位寻址内存可能存在,但不存在。 8 位字节现在几乎是通用标准。 (古代计算机有时有更大的字节,见wikipedia's Byte article的历史部分。)
【讨论】:
char str[] 示例假设 CHAR_BIT == 8,即使在可字寻址的机器上也是如此。但是实际的 C 实现很可能会定义 CHAR_BIT == 32。(如果 C11 支持线程,则它会要求:编写一个 char 数组元素不得执行包含单词的非原子 RMW,因为这可能会引入源中不存在数据竞争。)我的理解是,一些现代 DSP 仍然是字可寻址的。 (但我 5 年前不知道。)