【问题标题】:Difference between word addressable and byte addressable字可寻址和字节可寻址的区别
【发布时间】:2011-02-13 01:04:58
【问题描述】:

有人可以解释WordByte 可寻址之间的区别吗?它与内存大小等有什么关系?

【问题讨论】:

标签: memory operating-system cpu-architecture


【解决方案1】:

Memory units可寻址。这是我们使用内存的唯一方法。

实际上,内存只是byte addressable。意思是:

  • 二进制地址始终只指向a single 字节
  • word 只是 a group of bytes248,具体取决于 数据总线 size of强> CPU。

要全面了解memory operation,您必须熟悉CPU的各种寄存器内存端口RAM。我假设您知道它们的含义:


  • MAR内存地址寄存器
  • MDR内存数据寄存器
  • PC程序计数器寄存器
  • MBR(内存缓冲寄存器)

RAMtwo内存端口

  1. 32-bits 用于数据/地址
  2. 8-bit 表示 操作码

假设 CPU 想要从 地址 读取 a word(比如 4 bytesxyz 以后。 CPU会将地址放在MAR上,发送内存读取信号内存控制器芯片。在收到地址读取信号后,内存控制器会将数据总线连接到32-bit port4 bytesaddress 开始 xyz 将流出 portMDR

如果CPU想要获取下一个指令,它会将地址放入PC寄存器并向内存控制器发送一个获取信号。在接收到地址并获取信号后,内存控制器会将数据总线连接到8 -bit porta single byte long opcode 位于 address 收到将流出 RAM 进入 CPUMDR

这就是我们说某个寄存器内存可寻址字节可寻址的意思。现在,当您在 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 2MAR bit 1 连接到 地址总线强>line 3等等。 MAR 的上层 2 bits 被丢弃,因为它们仅在 2^32 以上的字地址 中需要,这些对于我们的 32 bit 机器均不合法。
使用这个映射,当 MAR1address 4 放在 bus 上,当 MAR2,@987654368 @ 放在 bus 上等等。

一开始有点难以理解。我是从Andrew Tanenbaums结构化computer organisation那里学到的。

【讨论】:

  • 据我了解您的回答,CPU 中应该有某种电路来决定内存操作是针对字节还是字,尤其是当数据返回 MDR 时,例如,只读取 32 位数据总线的第一个字节。但我怀疑这是一个正确的假设?
【解决方案2】:

这张图片应该很容易理解: http://i.stack.imgur.com/rpB7N.png

简单地说,

• 在字节寻址方案中,第一个字从地址 0 开始,并且 第二个字从地址 4 开始。

• 在字寻址方案中,第一个字的所有字节都位于 在地址 0 中,第二个字的所有字节都在地址 1 中。

当我们考虑一次处理一个字节的数据的应用程序时,字节寻址能力的优势就很明显了。在字节可寻址系统中访问单个字节只需要发出单个地址。在 16 位字可寻址系统中,首先必须计算包含该字节的字的地址,取出该字,然后从两字节字中提取该字节。尽管字节提取的过程很好理解,但它们的效率低于直接访问字节。因此,许多现代机器都是字节可寻址的。

【讨论】:

    【解决方案3】:

    可寻址性是具有自己地址的内存单元的大小。它也是您可以在不影响其邻居的情况下修改的最小内存块。

    例如:一个机器,其中字节是正常的 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 年前不知道。)
    猜你喜欢
    • 2019-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-28
    • 1970-01-01
    • 2019-02-27
    • 1970-01-01
    相关资源
    最近更新 更多