題:
8位處理器如何支持超過256字節的RAM?
ZaqueoAlejandro
2013-02-14 04:21:48 UTC
view on stackexchange narkive permalink

如果 32 位處理器可以處理大約4 GiB的RAM(即 \ $ 2 ^ {32} = 4294967296 \ $ span>)個字節,為什麼我的Arduino Mega 2560具有8 KiB的SRAM,如果是 8 位處理器,則它只能處理256個字節( \ $ 2 ^ 8 \ $ span>)?還是我閱讀以下頁面不正確?

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

當然,只要有足夠的時間,任何圖靈完整的機器都能夠處理幾乎所有尺寸的滑枕。
實際上,處理器名稱中的位數只能用於內部數據寬度的預先估算。8088是16位處理器,因為它具有16位寄存器,但具有8位數據總線和20位地址總線。68000是32位處理器,由於其32位寄存器而通常被稱為16/32位,但具有16位數據總線和24位地址總線。小型ARM實現是32位處理器(32位寄存器和數據總線),但是即使它們使用32位作為地址,它們也無法總共尋址4 GB。
我為這些單位添加了正確的SI前綴。\ $ 2 ^ {30} \ $是gibi(Gi),\ $ 2 ^ {10} \ $是kibi(Ki)。
值得一提的是,許多8位苦澀者(特別是摩托羅拉衍生品)都支持所謂的_zero-page_,這是指令集支持,用於更快地處理內存映射中的前256個可尋址字節。因此,出於性能原因,大多數時間緊迫的硬件寄存器等都將映射到前256個字節中。這就是為什麼在許多體系結構中會發現從地址零映射的硬件寄存器的原因。
稱8位,16位,32位等為市場術語,工程師用它來表示,但要理解這並不意味著該處理器中的所有功能都那麼寬。一些人使用指令的大小,很多時候使用通用寄存器的大小,有時使用總線。您擁有的程序計數器並不總是可以在指令中訪問或使用,因此可以任意擴展。然後,與許多AVR類型的處理器一樣,有一個多寄存器或分頁方案,或者兩者都有,以獲取更寬的數據事務加載/存儲地址。
九 答案:
Brian Drummond
2013-02-14 05:00:47 UTC
view on stackexchange narkive permalink

大多數8位CPU都具有16位地址總線,允許它們尋址64 KB,這恰恰是因為256字節確實不足以完成很多工作!這僅表示每次需要加載地址時,它們都需要加載兩個字節而不是一個字節。考慮到它們的大小,速度稍慢但可以忍受。

(是的,有很多例外,大多數例外是在64k變得太小時開發出來的,但是我們在這裡談論的是基本思想)。

實際上,我遇到的大多數8位微控制器都沒有16位地址
-1
或高8位然後低8位,但基本上是這樣。
諸如PIC18之類的某些微控制器有一個段寄存器,使它們能夠擴展其地址空間,使其超出16位指令集中可編碼的範圍。此外,可以使用IO引腳作為外部RAM組上的芯片選擇來擴展內存。
phuclv
2014-05-07 07:32:10 UTC
view on stackexchange narkive permalink

地址總線數據總線是分開的,因此它們可能具有不同的大小。對於任何特定的地址總線大小,有很多技術可以尋址比寄存器位寬更多的內存

  • 最常見的方法是增加地址總線

    • 使用多個寄存器作為地址的寬度

      • AVR 具有R26。可以配對為.R31的16位 X Y Z 數據尋址寄存器,以允許最大64KB的RAM。依次將它們與 RAMPX RAMPY RAMPZ 配對,以訪問更大版本的更高RAM地址。除了具有超過256字節RAM 1 sup> li的變量中的 SPL 之外,它還具有用於堆棧指針高字節的 SPH 。 >
      • Intel 8080 Zilog Z80 是8位CPU,但是它們具有寄存器對,例如 H & L B & C D & E 可以一起用作16位地址寄存器
    • 使用比自然大小大的單個大型特殊寄存器進行尋址

      • Intel 8051 是一個8位微控制器,即它具有8位數據地址。但是,它使用16位指令地址並具有2個16位寄存器:PC和DPTR用於在指令空間中尋址。
      • AVR 具有16或22位PC寄存器
    • 使用特殊寄存器來存儲地址的高位 。當尋址某些存儲器時,默認情況下,地址的低8位將取自8位微控制器上的8位立即數或8位寄存器,而高位將被另一個地址寄存器的值代替。 / p>

      • 一種特殊情況是 分段內存 ,它由 16位x86 使用。在這種技術中,內存被分為大小為64KB(2 16 sup>個字節)的多個段。默認情況下,普通訪問位於單個段內,因此它們可以將16位地址用於附近數據相距較遠的數據必須通過段值專門尋址,因此必須使用2個寄存器進行遠尋址。
      • PIC微控制器,其基線而中檔系列可能具有13位或14位地址,這是另一個示例。使用 call goto 指令時,立即數指示地址的8位或9位低位,其餘部分從當前程序計數器中獲取。因此訪問當前段附近的任何內容僅需使用一條指令,而進一步的地址將需要2條指令(以設置高位)。
      • 另一個示例是 MIPS 架構,還無條件跳轉時將低26位立即數地址與 PC 中的高6位相結合。
  • 實現此目標的另一種方法是 內存銀行 。這是一種有用的方法,如今仍在某些體系結構中使用。在此模型中,內存分為多個 bank 。每次您只能尋址特定的銀行。通常會有隨時可見的全局存儲區或地址範圍,但是對於其他部分,您必須在需要時切換存儲區。

    • Intel 8051 使用內存存儲區來實現寄存器。它有32個寄存器,但一次只能看到8個。
    • x86 PAE ARM LPAE ,更大的物理地址空間映射到一個虛擬地址空間小
    • 與此相關的另一個應用程序是Windows上的 地址窗口擴展,可由PAE模式下的32位x86應用程序使用,以訪問超過2 / 3GB的空間的記憶。它不完全像微控制器上的存儲庫,但可以這樣看,因為大的地址範圍可以考慮到足夠小的窗口/庫,以適合應用程序的地址空間。如果應用程序需要在某個窗口中使用數據,它將將該窗口映射到其當前地址空間。
    • DOS還具有某些類型的存儲區切換,例如擴展內存擴展內存,因為它的可尋址內存範圍有限。
  • 還有一種不太常見的技術,但是可以在中找到英特爾8051 。作為具有8位數據地址的微控制器,它最多可以具有256個地址。一半的空間(高位部分)用於特殊功能寄存器( SFR ),從而將可尋址的實際RAM限制為僅128個字節。但是現代的8051系列製造商發現了一種巧妙的方法來解決此問題,方法是 分離內存訪問 。儘管寄存器將訪問RAM的高端,但直接尋址將訪問 SFR ,而間接尋址將訪問RAM,這意味著現在您有256 + 128 = 384可尋址字節。


1 sup> https://en.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字節數據地址空間(≥256字節RAM)的模型具有16位堆棧指針,
  2. ROM大於8 KiB的模型添加2字(22位)JUMP和CALL指令。 (如果在跳過指令後接2字指令,則某些早期模型會出現錯誤。)
  3. ROM大於64 KiB的模型會添加ELPM指令和相應的RAMPZ寄存器。 LPM指令將ROM地址零擴展到Z; ELPM指令在RAMPZ寄存器前添加高位。這與更通用的LPM指令不同。存在只有ELPM的零操作數形式的“經典”模型(ATmega103和at43usb320)。當自動遞增功能可用時(大多數型號),它會更新包括RAMPZ在內的整個24位地址。
  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. ol>
dprogrammer
2013-02-14 04:41:18 UTC
view on stackexchange narkive permalink

數據總線線(引腳)和地址線(引腳)完全分開。簡而言之,數據總線線確定一次最多可傳輸一次(並存儲在存儲器中)的最大位數,而地址線確定一次可以選擇的最大存儲“單元”數。

大部分是32位x86 CPU不能處理超過4GB RAM的市場營銷活動。我記得某個地方在奔騰4 CPU上有A33-34引腳。

您是正確的-PAE允許使用更多的RAM,但是由於在台式機Windows上不可用,因此沒有多少人使用過它。
[PAE](http://en.wikipedia.org/wiki/Physical_Address_Extension)是功能的名稱。此外,正如\ $ 2 ^ {64} \ $所建議的那樣,64位處理器無法處理64艾字節。
如果沒有操作系統的明顯複雜性(不移植到其他體系結構),x86 CPU的地址不能超過4GB。
@Kaz ARM 32位具有類似的功能,稱為LPAE,它允許操作系統尋址32位以上的地址
supercat
2013-02-14 05:31:39 UTC
view on stackexchange narkive permalink

幾乎所有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以加0或1,具體取決於前一個加法是否在通過用ALU結果[$ 1334]替換上半部分而形成的地址上產生了進位
  5. 讀存儲器。累加器將與下一條指令的獲取重疊。另外,對於許多操作,如果步驟3沒有生成進位,則步驟4將讀取正確的地址,並且執行可以直接從步驟4跳到下一條指令,而繞過步驟5。

    如果檢查操作順序,則會注意到一點端架構比大端架構具有明顯優勢,在大多數情況下(儘管未顯示),即使ALU佔用了一個優勢。循環執行加法操作,可以從計算的地址讀取一個字節而無需等待ALU結果,因為通常提取的高字節將是目標操作數的高字節。在具有8位ALU的big-endian機器上,索引加載至少需要5個週期(因為地址的下半部分要到第3步才能讀取,因此將在第4步中進行計算)。

我記得有一些廣告是關於8位處理器和1 MB內存的計算機的。這是通過使用CPU上的兩個8位寄存器加上一個不在CPU上的8位寄存器構成整個地址來完成的。
@user6030:有許多完成此類事情的方法。通常,地址空間的某些部分將是“固定的”,而其他部分將是庫選擇的。有些設備對程序員來說效果很好。還有很多,不是很多。
Gus Mueller
2013-02-14 05:05:30 UTC
view on stackexchange narkive permalink

可尋址內存大小和內部寄存器大小之間通常存在某些關係,儘管這種關係由於不同的原因而有所不同。甚至在微處理器的早期,就認為256字節的地址空間太小,因此大多數八位處理器產生16位(兩個字節)的地址,該地址尋址64 KB。但是,通過存儲體切換(基本上使用某些I / O線來產生更多的地址線),可以實現更多的功能。

在前16位和32位處理器中,設備上的引腳總是不足以到達其內部地址寄存器可以尋址的所有空間。例如,在Motorola 68000上,儘管內部地址寄存器為32位寬,但只有足夠的地址引腳(24)可以尋址16 MB的RAM。

GNA
2018-07-05 15:39:42 UTC
view on stackexchange narkive permalink

我將專門針對您提到的AVR控制器回答此問題。基本原理對於許多其他8位架構也適用。

AVR是8位內核。這意味著它們具有8位寄存器。但是,8位不足以訪問可用的內存量。因此,AVR內核能夠使用一組特定的寄存器,將其組合為16位指針寄存器。寄存器r30和r31(也別名為ZL和ZH)就是一個例子。它們一起形成Z指針。

在彙編中讀取地址0x1234的字節看起來像這樣:

  ldi ZL,0x34;用地址的低字節加載r30(ZL)
ldi ZH,0x12;向r31(ZH)加載地址的高字節
ld r16,Z;將字節加載到r16
 

AVR系列有3個寄存器對可用於此目的。它們是專門為允許此類操作而設計的硬件。

當使用C之類的高級語言進行編程時,編譯器會處理這些東西。


注意:某些AVR甚至支持大於64k的內存大小。這些控制器具有特殊的功能寄存器,其中的其他位地址在訪問之前被寫入。因此,該地址由以下位(MSB至LSB)組成:

特殊功能寄存器(通常僅使用1位),ZH(8位),ZL(8位)。這樣產生的總地址為17位,並允許訪問128 kiB的RAM。

Kamil
2014-05-07 08:00:18 UTC
view on stackexchange narkive permalink

Wikipedia對此進行了很好的解釋:

八位CPU使用8位數據總線,因此可以在一條機器指令中訪問8位數據。 。由於實際和經濟上的考慮,地址總線通常是雙八位位組寬(即16位)。這意味著在大多數8位處理器上,直接地址空間僅為64 KB。

Garrett Fogerlie
2013-02-14 05:04:44 UTC
view on stackexchange narkive permalink

Atmel的8位AVR實際上使用16位數據地址。還有許多其他的16位寄存器,甚至還有一些16位定時器。由於它只是8位處理器,因此通常使用兩個時鐘週期來加載16位寄存器。

Jamie Hanrahan
2017-06-20 16:17:00 UTC
view on stackexchange narkive permalink

處理器的“位寬”建立了處理器可以處理的最大RAM量的觀念是計算中最普遍的神話之一。實際上,行業歷史上充斥著沒有這種關係的CPU。

HP 21MX,HP 1000:16位CPU,內存為16 MB

PDP-11:16位CPU,內存為4 MB

VAX-11 / 780:32位CPU,內存為512 MB

等,等等。



該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 3.0許可。
Loading...