【问题标题】:Limits on Addressability?可寻址性的限制?
【发布时间】:2011-02-27 14:28:41
【问题描述】:

我正在阅读一些C语言的地址:

https://cs.senecac.on.ca/~lczegel/BTP100/pages/content/compu.html

Addressible Memory 部分中,他们说“可寻址主存储器的最大大小取决于地址寄存器的大小。

我不明白为什么会这样。

谁能给我一个清楚的解释,好吗?

非常感谢。

【问题讨论】:

    标签: c memory-address computer-architecture


    【解决方案1】:

    如果您有 32 位寄存器,那么您可以在单个寄存器中存储的最高地址是 2^32-1,因此您可以寻址 2^32 个单位(在现代计算机中,单位几乎总是字节)。更大的数字根本不适合。

    您可以通过使用大于单个寄存器可以容纳的内存地址来解决此问题(并且某些 CPU/操作系统具有这样做的功能),但使用地址/指针会更慢,因为它必须摆弄多个注册。

    例如,假设您有 32 位寄存器但有 64 位指针,并且想要递增指针以查找 char (++p) 数组中的下一项。处理器不必执行简单的递增指令,而是必须

    1. 增加低 32 位;
    2. 检查结果是否为零(溢出);
    3. 如果发生溢出,也增加上半部分。

    稍微简化一下,这意味着它必须执行分支(if-then-else)指令,这是现代 CPU 执行的最慢和最复杂的指令之一。

    (例如,参见维基百科上的x86 memory segmentation,了解英特尔处理器中使用的多寄存器寻址方案。)

    【讨论】:

      【解决方案2】:

      保持简单:地址寄存器用于存储和引用内存地址;因为它们的大小和数量是固定的,所以有一个最大地址

      显然,您不能利用比可寻址更多的内存(因为机器不知道如何引用它),因此可用内存实际上受到地址寄存器可以表示的最大地址的限制.

      【讨论】:

      • 不完全是;许多 CPU 和操作系统可以寻址更大的内存,但这是有代价的。
      • @larsmans:我保持简单。当然有很多特定于平台的技巧可以绕过这个限制(例如 IA32 上的 PAE),但基本概念是可寻址内存受地址大小的限制。
      【解决方案3】:

      如果你有 1 个地址寄存器,保存一个 16 位地址,你最多可以有 2^16 - 1 个地址。

      无论有多少寄存器,它们可以指向的地址数量都会受到它们的宽度(位数)的限制。

      因此,可寻址主存储器的最大大小取决于地址寄存器的大小。

      【讨论】:

      • 不,如果你有 16 个位宽的地址寄存器,你可以有 2 个地址,但实际上有很多寄存器指向它们。对初学者没什么帮助
      • @Peer Stitzinger - 把我的术语弄混了。答案已更新。
      • 不知何故无法撤销我的 -1 自从您编辑后它应该可以工作。也许是一场比赛,如果你再次编辑它可能会起作用
      猜你喜欢
      • 2011-02-13
      • 2013-02-22
      • 1970-01-01
      • 2019-02-27
      • 2019-11-05
      • 1970-01-01
      • 1970-01-01
      • 2012-03-06
      • 1970-01-01
      相关资源
      最近更新 更多