CPU의 구성과 동작 원리는 펌웨어 개발에 도움이 많이 될 것 같아서 정리해본다.CPU는 논리회로의 집합체이다. 개인적으로 생각으로는 이런 CPU를 만들어내는 것이 진정한 반도체 기술이라고 생각한다. (우리는 이미 만들어진 CPU를 사용하여 또 다른 회로를 만든다... )
CPU에 구성된 pin들에 신호를 주게되면, 그에 대한 일을 수행하는 원리이다. 예를 들어 8bit CPU에서 0~7번 까지의 약속된 신호를 주게 되면 CPU는 그에 해당하는 일을 하게 된다. 당연하게도 CPU제조사 마다 구성은 다르기에 핀을 굳이 외우고 다닐 필요까진 없고
1. CU (Control Unit, 제어 유닛)
제어 유닛인 CU는 ALU과 REGISTER 등의 주변 유닛을 제어하여 기계어 명령을 읽고 어떤 동작을 해야하는 해석하고 실행하는 부분이다. 실질적으로 CPU에서 CU가 거의 모든일을 담당한다. 기계어 명령에 대해서는 아래에서 다룬다.
2. ALU (Arithmetic Logic Unit, 연산 유닛)
ALU는 산술과 로직 연산을 담당한다. ALU는 1개 또는 2개 이상의 피연산자와 1개의 출력을 가지는 데 ,다양한 연산과 AND, OR 등의 논리 연산을 수행할 수 도 있다. 연산 결과의 상태는 상태 레지스터에 비트로 표시된다.
3. 레지스터 (REGISTER) <- CPU전용 메모리
CPU는 명령이나 데이터를 메모리(Memory)에서 읽어와 수행하는 데, 이 정보를 읽어오기 위한 통신 신호선을 버스라 한다. 이 신호선이 길수록 저항과 커패시턴스의 영향으로 신호 지연이 발생해 통신 속도에 제약이 생긴다.
레지스터는 이런 문제를 생각하여서 속도의 지연 없이 가장 빨리 접근 할 수 있도록 CPU 블록(회로) 안에 두어 데이터의 임시 저장, 연산 작업 등에 사용하는 CPU 전용 메모리이다.
아래는 특수용도의 레지스터이며 알아두면 좋다.
- *PC (Program Counter) : 다음 실행될 명령어의 메모리 주소 저장
- IR (Instruction Register) : PC 주소의 메모리에서 읽어온 명령어 저장 (CU는 IR레지스터의 명령어를 해석하여 수행한다.)
- LR (Link Register) : 함수 호출 시 수행 후 복귀 될 주소 저장
- PSR (Program Status Register) : 명령을 수행한 후 연산 결과 등에 대한 CPU 상태 정보 기록 (산술 연산에 대한 결과 비트로는 Overflow, Negatuve, Zero, Carry, Parity 비트 등이 있다.)
- MAR (Memory Address Register) : 메모리 또는 IO 로의 읽기/쓰기 동작이 수행될 주소가 저장된 레지스터
- MBR (Memort Buffer Register) : 메모리 또는 IO 에서 읽거나 쓸 데이터가 임시 저장되는 레지스터
- *SP (Stack Pointer Register) : 스택의 현재 위치 주소를 저장한 레지스터
*PC (Program Counter)
다음 수행할 명령의 메모리 주소를 저장하고 있는 레지스터로 실행되고 있는 위치를 의미한다. CPU는 이 PC 레지스터의 주소에서 명령을 읽어오면 자동적으로 PC 레지스터의 값은 하나 증가하여 다음 주소를 가리킨다.
*SP (Stack Pointer Register)
스택(Stack)은 데이터를 저장하고 복원하는 등의 동작에 사용되는 메모리 저장 구조를 나타낸다.
스택은 마지막에 저장된 데이터가 맨 처음 나온다 하여 LIFO(후입선출) 구조라 한다.
SP 레지스터가 현재 스택의 주소를 저장하고 있으며, 보통은 초기화 때 메모리의 최상단에 위치한다.
데이터를 추가할 수록 SP는 아래로 증가하는 구조를 가진다.
4. CPU 동작 단계
고성능 CPU들은 속도 효율 개선을 위하여 3단계 이상으로도 구현되기도 하지만, 기본은 이 3단계의 동작과정이다.
(1) 명령어 인출 (Fetch)
PC(Program Counter) 레지스터에는 수행할 명령어에 대한 메모리 주소가 저장되어 있다. Fetch 단계에서는 이 PC 레지스터의 주소에서 명령어를 인출하여 IR레지스터에 저장한 후 PC레지스터의 주소를 한 단계 증가시켜 다음 명령을 가리키게 한다.
(2) 명령어 분석 (Decode)
인출 과정을 통해 IR에 읽어온 명령어를 미리 약속되어 정의된 명령어 구조(RISC/CISC)에 맞게 해석하고 실행 준비를 한다.
(3) 명령어 실행 (Execute)
명령을 실행하는 단계로 해석된 명령을 레지스터들과 산술/논리 연산이 필요하다면 ALU를 이용하여 실행한다.
'Embedded System > 소프트웨어 (C,C++)' 카테고리의 다른 글
[C++] 참조자 (Reference)/ 참조에 의한 호출(Call-by-reference) (0) | 2024.06.21 |
---|---|
[C++] 함수 오버로딩 (Function Overloading) (0) | 2024.06.20 |
[C++] 클래스, 객체 기초 (0) | 2023.08.27 |
[F/W] 메모리 영역 (스택, 힙) (0) | 2023.08.24 |
[F/W] 펌웨어와 부트로더(BootLoader) (0) | 2023.08.23 |