8 비트 프로세서는 어떻게 256 바이트 이상의 RAM을 지원할 수 있습니까?


14

경우 32 비트 프로세서 RAM의 약 4 지브을 처리 할 수 있습니다 (즉, ) 바이트, 않습니다 왜 내 아두 이노 메가 2560 SRAM의 8 킬로바이트를하는 것을 경우 8 비트 프로세서하기로 할 수 있습니다 256 바이트 만 처리 합니까 ( )? 아니면 다음 페이지를 잘못 읽고 있습니까?232=429496729628

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


5
튜링이 완료된 모든 기계는 충분한 시간이 주어지면 거의 모든 크기의 램을 처리 할 수 ​​있습니다.
John U

2
실제로 프로세서 이름의 비트 수는 내부 데이터 너비의 사전 예측에만 사용할 수 있습니다. 8088은 16 비트 레지스터로 인해 16 비트 프로세서이지만 8 비트 데이터 버스와 20 비트 주소 버스가 있습니다. 68000은 32 비트 레지스터 때문에 16/32 비트라고하는 32 비트 프로세서이지만 16 비트 데이터 버스와 24 비트 주소 버스가 있습니다. 소규모 ARM 구현은 32 비트 프로세서 (32 비트 레지스터 및 데이터 버스)이지만 주소에 32 비트를 사용하더라도 총 4GB를 처리 할 수 ​​없습니다.
busybee

이 단위에 맞는 SI 접두사를 추가했습니다. 은 gibi (Gi)이고 2 10 은 kibi (Ki)입니다. 230210
Elliot Alderson

많은 8 개의 비터 (특히 Motorola 파생 제품)가 소위 zero-page를 지원한다는 점은 언급 할 가치가 있습니다. 이는 메모리 맵에서 처음 256 개의 주소 지정 가능 바이트를 처리하는 명령 세트 지원이 약간 더 빠릅니다. 따라서이 성능상의 이유로 가장 중요한 하드웨어 레지스터 등이 처음 256 바이트에 매핑됩니다. 이것이 많은 아키텍처에서 주소 0에서 매핑 된 하드웨어 레지스터를 찾는 이유입니다.
룬딘

8 비트, 16 비트, 32 비트 등을 호출하는 것은 마케팅 용어라고 할 수 있습니다. 엔지니어는이 용어를 사용하지만 해당 프로세서의 모든 것이 그렇게 넓다는 것을 이해하지는 않습니다. 일부 사람들은 명령의 크기를 사용하며, 종종 범용 레지스터의 크기가 사용되며, 때로는 버스가 사용됩니다. 지침에 항상 액세스하거나 사용할 수있는 프로그램 카운터가 있으므로 원하는만큼 넓을 수 있습니다. 그런 다음 많은 AVR 유형 프로세서와 마찬가지로 데이터 트랜잭션을 위해 더 넓은로드 / 저장 주소를 얻기위한 다중 레지스터 또는 페이징 체계 또는 둘 다 있습니다.
old_timer

답변:


19

대부분의 8 비트 CPU에는 16 비트 주소 버스가있어 64KB를 처리 할 수 ​​있습니다. 정확히 256 바이트만으로는 충분하지 않기 때문입니다! 주소를로드 할 때마다 1이 아닌 2 바이트를로드해야한다는 의미입니다. 크기를 고려하면 약간 느리지 만 견딜 수 있습니다.

(예, 64k가 너무 작아 졌을 때 주로 개발 된 많은 예외가 있지만 여기서는 기본 아이디어에 대해 이야기하고 있습니다).


실제로 내가 경험 한 대부분의 8 비트 마이크로 컨트롤러에는 16 비트 주소가 없습니다
phuclv

@Brian Drummond Am 맞습니다 : 컨트롤러는 먼저 하위 8 비트를 쓴 다음 상위 8 비트를 쓴 다음 주소 버스를 래치합니다. 이것이 16 비트 주소 버스에 액세스하는 방법입니다!
Swanand

또는 상위 8 비트 다음 하위 8 비트이지만 기본적으로 그렇습니다.
Brian Drummond

7

어드레스 버스데이터 버스는 서로 다른 크기를 가질 수 있도록 분리된다. 특정 주소 버스 크기의 경우 레지스터 비트 너비보다 더 많은 메모리를 처리하는 많은 기술이 있습니다.

  • 가장 일반적인 방법은 어떻게 든 주소 버스 너비를 늘리는 것입니다

    • 주소에 여러 레지스터 사용

      • AVR은 16 비트에 한 쌍이 될 수 R26..R31 가지고 X, Y그리고 ZRAM의 최대 64킬로바이트 있도록 레지스터 어드레스 데이터. 차례로 사람들은와 결합 될 수있다 RAMPX, RAMPY, RAMPZ더 큰 버전 이상 RAM 주소를 액세스 할 수 있습니다. 또한 256 바이트 이상의 RAM을 가진 변형 SPH에 더하여 스택 포인터의 높은 바이트를 SPL가지고 있습니다 1
      • 인텔 8080자일 로그 Z80은 8 비트 CPU를,하지만 그들은 같은 레지스터 쌍이 H&을 L, B& C, D& E그는 16 비트 주소 레지스터로 함께 사용할 수 있습니다
    • 주소 지정을 위해 자연 크기보다 큰 단일 큰 특수 레지스터 사용

      • Intel 8051 은 8 비트 마이크로 컨트롤러입니다. 즉, 8 비트 데이터 주소가 있습니다. 그러나 16 비트 명령어 주소를 사용하며 명령어 공간에서의 주소 지정을위한 PC 및 DPTR 2 개의 16 비트 레지스터가 있습니다.
      • AVR 에는 16 또는 22 비트 PC 레지스터가 있습니다
    • 주소의 높은 부분에 특수 레지스터를 사용합니다 . 일부 메모리의 주소를 지정할 때 기본적으로 주소의 8 개의 하위 비트는 8 비트 마이크로 컨트롤러의 8 비트 즉시 또는 8 비트 레지스터에서 가져 오는 반면, 상위 비트는 다른 주소 레지스터의 값으로 대체됩니다.

      • 특별한 경우 는 16 비트 x86 에서 사용하는 세그먼트 메모리 입니다. 이 기술에서 메모리는 64KB (2 16 바이트) 크기의 여러 세그먼트 로 나뉩니다 . 일반 액세스는 기본적으로 단일 세그먼트 내에 있으므로 근거리 데이터에 16 비트 주소를 사용할 수 있습니다 . 더 멀리 떨어져있는 데이터는 세그먼트 값으로 구체적으로 지정해야하므로 원거리 주소 지정에는 2 개의 레지스터를 사용해야합니다.
      • PIC 마이크로 컨트롤러 , 그 기준과 중형 시리즈, 13 또는 14 비트의 어드레스를 가질 수있다, 다른 예이다. 주소를 사용 call하거나 goto명령 할 때 8 비트 또는 9 비트의 하위 비트가 즉시 표시되고 나머지는 현재 프로그램 카운터에서 가져옵니다. 따라서 현재 세그먼트 주변에서 멀지 않은 곳에 액세스하려면 하나의 명령어 만 사용하고 추가 주소에는 2 개의 명령어 (높은 비트를 설정)가 필요합니다.
      • 또 다른 예는 무조건 점프하는 동안 하위 26 비트 즉시 주소와 상위 6 비트를 결합 하는 MIPS 아키텍처입니다 PC.
  • 이를 달성하는 또 다른 방법은 메모리 뱅킹 입니다. 이것은 오늘날 일부 아키텍처에서 여전히 유용한 방법입니다. 이 모델에서 메모리는 여러 뱅크 로 나뉩니다 . 매번 특정 은행 만 처리 할 수 ​​있습니다. 글로벌 뱅크 또는 주소 범위가 항상 항상 보이는 경우가 종종 있지만 다른 부분의 경우 필요할 때 뱅크를 전환해야합니다.

    • 인텔 8051 은 레지스터에 메모리 뱅킹을 사용합니다. 32 개의 레지스터가 있지만 한 번에 8 개만 표시됩니다.
    • 더 큰 물리적 주소 공간이 작은 가상 주소 공간에 매핑 된 x86 PAEARM LPAE
    • 이를위한 또 다른 응용 프로그램은 2 / 3GB 이상의 메모리에 액세스하기 위해 PAE 모드에서 32 비트 x86 앱이 사용할 수있는 Windows 의 Address Windowing Extensions 입니다. 마이크로 컨트롤러의 메모리 뱅크와 정확히 같지는 않지만 큰 주소 범위는 앱의 주소 공간에 맞도록 작은 창 / 뱅크를 생각할 수 있기 때문에 볼 수 있습니다. 앱이 일부 창에서 데이터를 사용해야하는 경우 해당 창을 현재 주소 공간에 매핑합니다.
    • DOS는 제한된 범위의 주소 지정 가능한 메모리로 인해 확장 메모리 또는 확장 메모리 와 같은 일부 유형의 뱅크 스위칭 을 가지고 있습니다.
  • 꽤 일반적인 기술은 아니지만 Intel 8051 에서 찾을 수 있습니다 . 8 비트 데이터 주소를 가진 마이크로 컨트롤러는 최대 256 개의 주소를 가질 수 있습니다. 공간의 절반 (높은 부분)은 특수 기능 레지스터 ( SFR )에 사용되며 실제 RAM은 128 바이트로 제한 할 수 있습니다. 그러나 현대 8051 시리즈 제조업체는 메모리 액세스분리 하여이를 극복 할 수있는 영리한 방법을 찾았습니다 . 주소 직접 액세스 할 SFR을 하면서 간접 주소 지정 레지스터는 RAM의 높은 부분에 액세스하지만 지금은 256 + 128 = 384 주소 바이트를 가지고있는 의미합니다.


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

가장 작은 코어는 256 바이트 이하의 데이터 주소 공간 (I / O 포트 및 기타 예약 된 주소가 제거 된 후 128 바이트 이하의 RAM을 의미 함)과 ≤8192 바이트 (8KiB)의 프로그램 ROM을 갖습니다. 여기에는 8 비트 스택 포인터 (SPL) 만 있으며 12 비트 상대 점프 / 호출 RJMP / RCALL 만 지원합니다. (AVR 프로그램 카운터는 바이트가 아닌 16 비트 워드를 카운트하기 때문에 12 비트 오프셋은 213 바이트의 ROM을 처리하기에 충분합니다.)

사용 가능한 리소스에 액세스하는 데 필요한 추가 메모리 주소 지정 기능이 있습니다.

  1. > 256 바이트 이상의 데이터 주소 공간 (≥256 바이트의 RAM)을 가진 모델은 16 비트 스택 포인터를 가지며 SPH 레지스터의 절반이 높습니다.
  2. ROM이 8KiB 이상인 모델은 2 워드 (22 비트) JUMP 및 CALL 명령어를 추가합니다. 건너 뛰기 명령 다음에 2 워드 명령이 오는 경우 일부 초기 모델에서는 오류가 발생합니다.
  3. ROM이 64KiB 이상인 모델은 ELPM 명령어 및 해당 RAMPZ 레지스터를 추가합니다. LPM 명령어는 ROM 주소를 Z로 0 확장합니다. ELPM 명령어는 RAMPZ 레지스터 앞에 높은 비트를 붙입니다. 이것은 일반적인 LPM 명령어와 동일하지 않습니다. 제로 오퍼랜드 형식의 ELPM (ATmega103 및 at43usb320) 만있는 "클래식"모델이 있습니다. 자동 증분을 사용할 수있는 경우 (대부분의 모델) RAMPZ를 포함하여 전체 24 비트 주소를 업데이트합니다.
  4. ROM이 128KiB 이상인 (레어) 모델에는 3 바이트 프로그램 카운터가 있습니다. 서브 루틴 호출 및 리턴은 추가 바이트 공간의 스택 공간을 사용하고, 무관 한 점프 및 호출을위한 추가 높은 비트를 제공하는 새로운 EIND 레지스터가 있으며, EIND : Z를 대상 주소로 사용하는 새로운 확장 명령어 EIJMP 및 EICALL이 있습니다. (이전 IJMP 및 ICALL 명령어는 확장되지 않은 Z를 사용합니다.)
  5. RAM 주소 공간이 64KiB 이상인 (레어) 모델은 RAMPX, RAMPY, RAMPZ 및 RAMPD 레지스터를 사용하여 16 비트 RAM 주소 지정 한계를 확장합니다. 이들은 각각 X, Y 또는 Z 레지스터 쌍을 사용하는 주소 지정 모드 또는 직접 주소 지정 명령어 LDS / STS를위한 추가 하이 비트를 제공합니다. ROM 액세스와 달리 고유 한 "확장 된"명령어는 없습니다. 대신 RAMP 레지스터가 무조건 사용됩니다.

6

거의 모든 8 비트 프로세서는 하위 부품과 상위 부품에서 16 비트 주소를 형성 할 수 있습니다. 원래 8080을 포함한 일부 프로세서에는 주소의 상단과 하단을 유지하는 전용 레지스터가 있습니다 (프로그래머의 관점에서 보면 8080의 스택 포인터와 같은 일부 레지스터는 별도로 주소 지정하는 명령을 제공하지 않을 수 있음). 일부 다른 프로세서에는 주소의 상반신에 할당 된 레지스터가 없지만 주소는 "즉시"조립됩니다. 예를 들어, 6502에서 "LDA $ 1234, X"명령어는 8 비트 X 레지스터에 $ 1234를 추가하여 형성된 주소로 누산기를로드합니다 ($ F0을 포함한다고 가정). 해당 명령의 실행은 4 단계 또는 5 단계로 진행됩니다.

  1. 이전 명령어 (있는 경우)에서 레지스터 쓰기를 완료하고 opcode ($ BD)를로드합니다.
  2. 명령을 디코딩하는 동안 opcode 다음에 첫 번째 피연산자 바이트를 가져옵니다 ($ 34)
  3. 이전에 가져온 바이트를 X 레지스터에 추가하는 동안 두 번째 피연산자 바이트 ($ 12)를 가져옵니다.
  4. 두 번째 피연산자 바이트를 ALU 결과에 연결하여 형성된 주소의 메모리를 읽습니다 (예 : $ 1224). 이전 추가가 캐리를 생성했는지 여부에 따라 0 또는 1을 추가하기 위해 두 번째 피연산자 바이트를 ALU에 공급
  5. 절반을 ALU 결과로 대체하여 형성된 주소의 메모리 읽기 [$ 1334]

판독 바이트를 누산기로 전송하면 다음 명령어의 페치가 겹칩니다. 또한 많은 작업의 경우 3 단계에서 캐리가 생성되지 않으면 4 단계에서 올바른 주소를 읽었으며 5 단계를 무시하고 4 단계에서 다음 명령으로 바로 건너 뛸 수 있습니다.

작업 순서를 살펴보면 리틀 엔디안 아키텍처가 빅 엔디안 아키텍처에 비해 확실한 이점을 가지고 있음을 알 수 있습니다. 또한 ALU 결과를 기다리지 않고 계산 된 주소에서 바이트를 읽을 수 있습니다. 일반적으로 페치 된 상위 바이트는 대상 피연산자의 상위 바이트이기 때문입니다. 8 비트 ALU가있는 빅 엔디안 시스템에서 인덱스로드는 5 사이클 이상이 소요됩니다 (주소의 아래쪽 절반은 3 단계까지 읽지 않으므로 4 단계에서 계산 됨).


8 비트 프로세서와 1MB의 메모리가있는 컴퓨터에 대한 광고를 본 적이 있습니다. 이것은 전체 주소를 형성하기 위해 CPU에 2 개의 8 비트 레지스터와 CPU에없는 1 개의 8 비트 레지스터를 사용하여 수행되었습니다.
user6030

@ user6030 : 그런 것들을 달성하는 방법에는 여러 가지가 있습니다. 일반적으로 주소 공간의 일부는 "고정"되고 나머지는 은행 선택 가능합니다. 일부 장치는 프로그래머에게 잘 작동합니다. 다른 많은 사람들은 그렇게 많지 않습니다.
supercat

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- 비트 어드레스로 어드레스 이상 32 비트 운영체제 허용 LPAE라는 유사한 기능을 갖는다
phuclv을

3

주소 지정 가능한 메모리 크기와 내부 레지스터 크기 간에는 어떤 관계가있는 경우가 종종 있지만 관계는 다른 이유로 다릅니다. 초기 마이크로 프로세서에서도 256 바이트의 주소 공간이 너무 작은 것으로 간주되었으므로 대부분의 8 비트 프로세서는 64 비트를 처리하는 16 비트 (2 바이트) 주소를 생성했습니다. 그러나 뱅크 스위칭을 사용하면 (필수적으로 더 많은 주소 라인을 생성하기 위해 특정 I / O 라인을 사용) 훨씬 더 많은 것을 가질 수있었습니다.

첫 16 및 32 비트 프로세서에는 장치의 내부 주소 레지스터가 처리 할 수있는 모든 공간에 도달 할 수있는 핀이 항상 충분하지 않았습니다. 예를 들어 Motorola 68000에는 16MB의 RAM을 처리 할 수있는 충분한 주소 핀 (24) 만 있었지만 내부 주소 레지스터의 너비는 32 비트였습니다.


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

Wikipedia 는 그것을 잘 설명합니다.

8 비트 CPU는 8 비트 데이터 버스를 사용하므로 단일 머신 명령어로 8 비트 데이터에 액세스 할 수 있습니다. 주소 버스는 일반적으로 실용적이고 경제적 인 고려 사항으로 인해 2 옥텟 폭 (즉 16 비트)입니다. 이는 대부분의 8 비트 프로세서에서 64KB의 직접 주소 공간을 의미합니다.


1

프로세서의 "비트 폭"이 프로세서가 처리 할 수있는 최대 RAM 양을 설정한다는 개념은 컴퓨팅에서 가장 널리 퍼진 신화 중 하나입니다. 실제로 업계 역사는이 관계가 유지되지 않은 CPU로 가득 차 있습니다.

HP 21MX, HP 1000 : 16 비트 CPU, 16MB 메모리

PDP-11 : 16 비트 CPU, 메모리-4MB

VAX-11 / 780 : 32 비트 CPU, 512MB 메모리

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.