Published on

CPU

Authors
  • avatar
    Name
    유사공대생
    Twitter

CPU의 구성 요소

제어 유닛(Control Unit)

명령어 해석, 명령어 실행 등의 작업을 수행하는 유닛이다. 제어 유닛은 프로그램 카운터(PC)로부터 명령어를 읽어와 해석하고, 이를 적절한 실행 유닛으로 전달한다.

산술논리 유닛(ALU, Arithmetic Logic Unit)

산술 연산(덧셈, 뺄셈, 곱셈, 나눗셈 등)과 논리 연산(AND, OR, XOR 등)을 수행하는 유닛이다. ALU는 제어 유닛으로부터 명령어를 받아들여 해당 연산을 수행하고, 그 결과를 레지스터나 메모리에 저장한다.

레지스터(Register)

데이터를 저장하는데 사용되는 메모리 셀로, CPU 내부에 위치한다. 레지스터는 데이터를 임시로 저장하고 처리하는 데 사용되며, 대개 매우 빠른 데이터 처리 속도를 보장한다.

버스(Bus)

CPU 내부에서 데이터와 명령어를 전송하는 데 사용되는 통로이다. 버스는 데이터 버스, 주소 버스, 제어 버스 등의 종류가 있으며, 이를 통해 CPU 내부의 구성 요소들이 상호작용한다.

메모리 관리 유닛(MMU, Memory Management Unit)

가상 주소와 물리 주소 간의 매핑을 수행하는 유닛이다. MMU는 가상 주소 공간을 물리 주소 공간으로 변환하여 메모리에 접근할 수 있게 해주는 기능을 수행한다.

파이프라인(Pipeline)

CPU의 성능을 향상시키기 위한 기술로, 명령어를 처리하는 과정을 분리하여 동시에 여러 개의 명령어를 처리할 수 있게 한다. 파이프라인은 명령어 해석, 실행, 저장 등의 단계를 분리하여 병렬 처리할 수 있도록 한다.

CPU는 어떻게 동작하는지

CPU(중앙처리장치)는 컴퓨터의 핵심 부품으로, 프로그램을 실행하고 데이터를 처리하는 역할을 한다. CPU는 프로그램을 실행하기 위해 메모리에서 명령어와 데이터를 읽어오고, 명령어를 해석하고 처리하는 일련의 과정을 거친다.

명령어 해석

CPU는 메모리에서 읽어온 명령어를 해석하여 실행한다. 명령어는 연산자(예: 더하기, 빼기, 곱하기)와 피연산자(데이터)로 구성되며, CPU는 명령어에서 연산자와 피연산자를 구분하여 처리한다.

연산 처리

CPU는 명령어에서 지정된 연산을 처리한다. 이 때 CPU 내부의 레지스터(기억장치)를 사용하여 데이터를 저장하고 연산을 수행한다.

데이터 전송

CPU는 메모리와 입출력 장치 등 다양한 장치와 데이터를 주고 받을 수 있다. 데이터 전송은 주로 레지스터를 통해 이루어지며, CPU는 레지스터를 이용하여 데이터를 저장하고 이동시킨다.

제어 처리

CPU는 명령어를 실행하고 제어 신호를 발생시켜 다음 명령어를 가져오는 등의 제어 처리를 수행한다. 이 때 명령어의 분기(branch)나 점프(jump) 등을 처리하여 프로그램 흐름을 제어한다.

이러한 과정을 통해 CPU는 프로그램을 실행하고 데이터를 처리한다. CPU는 매우 빠르게 처리하며, 여러 개의 명령어를 동시에 처리할 수 있는 다중 코어(multi-core) 구조를 가진 CPU도 있어서 더욱 높은 성능을 발휘한다.

Object File

Dump - od -Ax -x prog.o

image

prog.o

  • arm-linux-gunueabihf-objdubp -d --source prog.o
prog.o:     file format elf32-littlearm
Disassembly of section .text:
00000000 <main>:
#include <stdio.h>
void main(void)
{
    0: b480 2:      push {r7}
    b085 4: af00    b085 4: af00
    4: af00         add r7, sp, #0

    int a, b, c;
    a = 10;
        6: 230a     movs r3, #10
        8: 607b     str r3, [r7, #4]

    b = 20;
        a: 2314     movs r3, #20
        c: 60bb     str r3, [r7, #8]

    c = a + b;
    e: 687a         ldr r2, [r7, #4]
    10: 68bb        ldr r3, [r7, #8]
    12: 4413        add r3, r2
    14: 60fb        str r3, [r7, #12]
}

    16: bf00        nop
    18: 3714        adds r7, #20
    1a: 46bd        mov sp, r7
    1c: f85d 7b04   ldr.w r7, [sp], #4
    20: 4770        bx lr
    22: bf00        nop