8位处理器如何支持超过256字节的RAM?


14

如果32位处理器可以处理大约4 GiB的RAM(即字节),为什么我的Arduino Mega 2560具有8 KiB的SRAM,如果是8位处理器则允许它仅处理256个字节(2 ^ 8)?还是我阅读以下页面有误?232=429496729628

http://www.atmel.com/devices/atmega2560.aspx?tab=参数


5
当然,只要有足够的时间,任何图灵完整的机器都能够处理几乎任何尺寸的滑枕。
约翰·U

2
实际上,处理器名称中的位数只能用于内部数据宽度的预先估算。8088是16位处理器,因为它具有16位寄存器,但具有8位数据总线和20位地址总线。68000是32位处理器,由于其32位寄存器而通常被称为16/32位,但具有16位数据总线和24位地址总线。小型ARM实现是32位处理器(32位寄存器和数据总线),但是即使它们将32位用于地址,也无法总共寻址4 GB。
busybee '19

我为这些单位添加了正确的SI前缀。是gibi(Gi),而是kibi(Ki)。 2 10230210
Elliot Alderson

值得一提的是,许多8位寄存器(特别是摩托罗拉衍生产品)都支持所谓的零页,这是指令集支持,用于更快地处理内存映射中的前256个可寻址字节。因此,出于性能原因,大多数时间紧迫的硬件寄存器等都将映射到前256个字节中。这就是为什么在许多体系结构中会发现从地址零映射的硬件寄存器的原因。
伦丁

称8位,16位,32位等为市场术语,工程师用它来表示,但要理解这并不意味着该处理器中的所有功能都那么广泛。一些人使用指令的大小,很多时候使用通用寄存器的大小,有时使用总线。您拥有的程序计数器并不总是可以在指令中访问或使用,因此可以任意扩展。然后,与许多AVR类型的处理器一样,有一个多寄存器或分页方案,或者两者都有,以获得更宽的数据事务加载/存储地址。
old_timer

Answers:


19

大多数8位CPU都有16位地址总线,允许它们寻址64kbyte,正是因为256个字节确实不足以完成很多工作!这仅表示每次需要加载地址时,它们都需要加载两个字节而不是一个字节。考虑到它们的大小,速度稍慢但可以忍受。

(是的,有很多例外,大多数例外是在64k变得太小时开发的,但是我们在这里谈论的是基本思想)。


事实上,大多数我遇到的8位微控制器不具备16位的地址
phuclv

@Brian Drummond我是否正确:控制器将先写入低8位,然后写入高8位,然后锁存地址总线。这就是它将如何访问16bit地址总线!
斯旺德2014年

或先高8位再低8位,但基本上是这样。
Brian Drummond 2014年

7

地址总线数据总线是分离的,这样他们可以具有不同的尺寸。对于任何特定的地址总线大小,有很多技术可以寻址比寄存器位宽更多的存储器

  • 最常见的方法是以某种方式增加地址总线的宽度

    • 使用多个寄存器作为地址

      • AVR具有R26..R31可配对成16位XYZ数据寻址寄存器,以允许的最大RAM 64KB。依次将它们与RAMPX,配对RAMPYRAMPZ可以访问更大版本的更高RAM地址。SPH除了SPL具有超过256个字节的RAM 1的变量外,它还具有堆栈指针的高字节。
      • Intel 8080Zilog Z80是8位CPU,但是它们具有像HLB&和&之类的寄存器对C,它们可以一起用作16位地址寄存器DE
    • 使用大于自然大小的单个大特殊寄存器进行寻址

      • 英特尔8051是8位微控制器,即它具有8位数据地址。但是,它使用16位指令地址,并具有2个16位寄存器:PC和DPTR用于在指令空间中寻址。
      • AVR具有16或22位PC寄存器
    • 对地址的高位使用特殊的寄存器。当寻址某些存储器时,默认情况下,地址的低8位将取自8位微控制器上的8位立即数或8位寄存器,而高位将被其他地址寄存器的值代替。

      • 这种情况的一个特殊情况是分段存储器,它由16位x86使用。在这种技术中,内存被分为大小为64KB(2 个16字节)的多个段。默认情况下,普通访问位于单个段内,因此它们可以将16位地址用于近数据相距较远的数据必须通过段值专门寻址,因此必须使用2个寄存器进行远寻址。
      • PIC微控制器,其基线和端系列可具有13或14比特的地址,是另一个例子。使用callgoto指令时,立即数指示地址的8位或9位低位,其余部分取自当前程序计数器。因此,访问当前段附近的任何内容仅需使用一条指令,而其他地址将需要2条指令(以设置高位)。
      • 另一个例子是MIPS架构,该架构还结合了低26位立即数地址和高6位,PC同时无条件跳转。
  • 实现此目的的另一种方法是内存存储。这是一种有用的方法,如今仍在某些体系结构中使用。在此模型中,内存分为多个存储体。每次您只能寻址特定的银行。通常会有随时可见的全局存储区或地址范围,但是对于其他部分,您必须在需要时切换存储区。

    • 英特尔8051将内存存储区用于寄存器。它有32个寄存器,但一次只能看到8个。
    • x86 PAEARM LPAE,具有更大的物理地址空间,映射到小的虚拟地址空间
    • 另一个用于此的应用程序是Windows上的“ 地址窗口扩展 ”,可由32位x86应用程序在PAE模式下使用,以访问超过2 / 3GB的内存。它不完全像微控制器上的存储库,但可以这样看,因为大的地址范围可以考虑到较小的窗口/存储库,这些窗口/存储库足够小以适合应用程序的地址空间。如果应用程序需要在某些窗口中使用数据,它将将该窗口映射到其当前地址空间。
    • DOS 由于其有限的可寻址内存范围,还具有某些类型的存储区切换,例如扩展内存扩展内存。
  • 还有一种不太常见的技术,但是可以在Intel 8051中找到。作为具有8位数据地址的微控制器,它最多可以具有256个地址。一半的空间(高半部分)用于特殊功能寄存器(SFR),从而将可寻址的实际RAM限制为仅128个字节。但是,现代8051系列的制造商发现了一种巧妙的方法,可以通过分离内存访问来克服这一问题。直接寻址将访问SFR,间接寻址将通过寄存器访问RAM的高端,这意味着现在您有256 + 128 = 384个可寻址字节。


1 https://zh.wikipedia.org/wiki/Atmel_AVR_instruction_set#Memory_addressing_instructions

最小的内核具有≤256字节的数据地址空间(这意味着在删除I / O端口和其他保留地址后,≤128字节的RAM)和≤8192字节(8 KiB)的程序ROM。它们仅具有8位堆栈指针(在SPL中),并且仅支持12位相对跳转/调用指令RJMP / RCALL。(由于AVR程序计数器计算的是16位字而不是字节,因此12位偏移量足以寻址213个字节的ROM。)

根据需要,还具有其他内存寻址功能,以访问可用资源:

  1. 数据地址空间大于256字节(RAM≥256字节)的型号具有16位堆栈指针,其高半部分位于SPH寄存器中。
  2. ROM> 8 KiB的型号增加了2字(22位)JUMP和CALL指令。(如果跳过指令后跟2字指令,则某些早期模型会出现错误。)
  3. ROM> 64 KiB的型号添加了ELPM指令和相应的RAMPZ寄存器。LPM指令将ROM地址零扩展到Z;ELPM指令在RAMPZ寄存器前加高位。这与更通用的LPM指令不同。存在只有ELPM的零操作数形式的“经典”模型(ATmega103和at43usb320)。当有自动递增功能(大多数型号)时,它将更新整个24位地址,包括RAMPZ。
  4. ROM> 128 KiB的(罕见)型号具有3字节程序计数器。子例程调用和返回使用额外的堆栈空间字节,有一个新的EIND寄存器为工业跳转和调用提供了附加的高位,还有新的扩展指令EIJMP和EICALL,它们使用EIND:Z作为目标地址。(以前的IJMP和ICALL指令使用零扩展Z。)
  5. (稀有)RAM地址空间大于64 KiB的型号通过RAMPX,RAMPY,RAMPZ和RAMPD寄存器扩展了16位RAM寻址限制。它们分别为使用X,Y或Z寄存器对或直接寻址指令LDS / STS的寻址模式提供了额外的高位。与ROM访问不同,没有明显的“扩展”指令。而是无条件地使用RAMP寄存器。

6

几乎所有的8位处理器都具有从低位部分和高位部分形成16位地址的能力。在包括原始8080在内的某些处理器上,有一些专用于保存地址的上部和下部的寄存器(尽管从程序员的角度来看,可能有些寄存器,例如8080的堆栈指针,它们没有提供单独寻址的指令)。在其他一些处理器中,没有专门用于地址上半部或下半部的寄存器,但是地址是“即时”汇编的。例如,在6502上,指令“ LDA $ 1234,X”将通过将$ 1234加到8位X寄存器(假设它包含$ F0)而形成的地址装入累加器。该指令的执行将分4步或5步进行:

  1. 完成上一条指令的寄存器写操作(如果有)并加载操作码($ BD)
  2. 解码指令时在操作码($ 34)之后提取第一个操作数字节
  3. 获取第二个操作数字节($ 12),同时将先前获取的字节添加到X寄存器
  4. 通过将第二个操作数字节与ALU结果连接而形成的地址读取存储器[即$ 1224]。将第二个操作数字节送入ALU以根据前一个加法是否产生进位来加零或加一
  5. 通过将上半部分替换为ALU结果[$ 1334]形成的地址读取内存

读取字节到累加器的传输将与下一条指令的获取重叠。此外,对于许多操作,如果步骤3没有生成进位,则步骤4将读取正确的地址,并且执行可以直接从步骤4跳到下一条指令,而绕过步骤5。

如果检查一下操作顺序,就会注意到,在大多数情况下(尽管未显示),小端架构比大端架构具有明显的优势,尽管ALU需要一个周期来执行另外,可以从计算的地址读取一个字节而无需等待ALU结果,因为通常提取的高字节将是目标操作数的高字节。在具有8位ALU的big-endian机器上,索引加载将至少花费5个周期(因为地址的下半部分要到步骤3才会被读取,因此将在步骤4中进行计算)。


我记得有一些广告是关于8位处理器和1 MB内存的计算机的。这是通过使用CPU上的两个8位寄存器加上一个不在CPU上的8位寄存器构成整个地址来完成的。
user6030

@ user6030:有很多方法可以完成这些任务。通常,地址空间的某些部分将被“固定”,而其他部分将是存储体可选的。有些设备对程序员来说效果很好。还有很多,不是很多。
超级猫

6

数据总线线(引脚)和地址线(引脚)是完全分开的。简而言之,数据总线线确定一次可传输的最大位数(并存储在存储器中),而地址线则确定可以选择的最大存储“单元”数。

32位x86 CPU不能处理超过4GB的RAM主要是一种营销手段。我记得某个地方在奔腾4 CPU上有A33-34引脚。


1
您是正确的-PAE允许使用更多的RAM,但是由于在台式机Windows上不可用,因此没有多少人使用过它。
pjc50

PAE是功能的名称。此外,正如所建议的那样,64位处理器无法寻址64艾字节。264
Phil Frost

如果没有操作系统的明显复杂性(不移植到其他体系结构),x86 CPU的地址不能超过4GB。
卡兹(Kaz)

1
@Kaz ARM 32位具有类似于LPAE的功能,该功能允许操作系统寻址超过32位的地址
phuclv 2014年

3

虽然可寻址内存大小与内部寄存器大小之间存在某种关系,但这种关系通常由于不同的原因而有所不同,这通常是事实。甚至在微处理器的早期,就认为256字节的地址空间太小,因此大多数八位处理器产生16位(两个字节)的地址,该地址寻址64 KB。但是,通过存储体切换(基本上使用某些I / O线来产生更多的地址线),可以实现更多的功能。

在前16位和32位处理器中,设备上的引脚总是不足以到达其内部地址寄存器可以寻址的所有空间。例如,在Motorola 68000上,尽管内部地址寄存器为32位宽,但只有足够的地址引脚(24)可以寻址16 MB的RAM。


2

我将专门针对您提到的AVR控制器回答此问题。基本原理对于许多其他8位架构也适用。

AVR是8位内核。这意味着它们具有8位寄存器。但是,8位不足以访问可用的内存量。因此,AVR内核能够使用一组特定的寄存器,将其组合为16位指针寄存器。寄存器r30和r31(也别名为ZL和ZH)就是一个示例。它们一起形成Z指针。

在汇编中,读取地址0x1234的字节看起来像这样:

ldi ZL, 0x34 ; Load r30 (ZL) with low byte of address
ldi ZH, 0x12 ; Load r31 (ZH) with high byte of address
ld r16, Z    ; Load byte to r16

AVR系列具有3个寄存器对可用于此目的。它们经过专门设计在硬件中以允许此类操作。

当使用像C这样的高级语言进行编程时,编译器会处理这些问题。


注意:某些AVR甚至支持大于64k的内存。这些控制器具有特殊的功能寄存器,其中的其他位地址在访问之前被写入。因此,该地址包含以下位(MSB至LSB):

特殊功能寄存器(通常为1个字节),ZH(8位),ZL(8位)。


1

Atmel的8位AVR实际上使用16位数据地址。还有许多其他的16位寄存器,甚至还有一些16位定时器。由于它只是一个8位处理器,因此通常使用两个时钟周期加载一个16位寄存器。


1

维基百科解释得很好:

八位CPU使用8位数据总线,因此可以在一条机器指令中访问8位数据。由于实际和经济上的考虑,地址总线通​​常为双八位位组宽(即16位)。这意味着在大多数8位处理器上,直接地址空间仅为64 KB。


1

处理器的“位宽”建立了处理器可以处理的最大RAM量的概念是计算中最普遍的神话之一。实际上,行业历史上充斥着没有这种关系的CPU。

HP 21MX,HP 1000:16位CPU,内存为16 MB

PDP-11:16位CPU,内存为4 MB

VAX-11 / 780:32位CPU,内存为512 MB

等等等

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.