cs

[크래프톤 정글] cpu 레지스터

하루이2222 2024. 9. 30. 17:45

레지스터는 CPU 내부에서 매우 빠른 속도로 데이터를 저장하고 처리하는 작은 크기의 메모리 공간이다. 

 

x86-64 아키텍처에서는 다양한 범용 및 특수 목적 레지스터가 존재하는데 ,  각각의 레지스터는 특정 용도나 연산에 최적화되어 있다.


1. 범용 레지스터 (General Purpose Registers)

범용 레지스터는 다양한 목적에 사용될 수 있으며, 기본적인 데이터 처리나 주소 계산 등에 활용된다. x86-64 아키텍처에서는 레지스터가 64비트 크기로 확장되었다.

64비트 32비트 16비트 8비트 상위 8비트 하위 설명
RAX EAX AX AH AL 주로 연산 결과를 저장하는 레지스터
RBX EBX BX BH BL 범용 레지스터로 임의의 데이터를 저장
RCX ECX CX CH CL 루프 카운터로 자주 사용됨
RDX EDX DX DH DL 입출력 작업이나 확장 연산에서 사용
RSI ESI SI - - 소스 주소를 저장할 때 사용
RDI EDI DI - - 목적지 주소를 저장할 때 사용
RBP EBP BP - - 베이스 포인터로, 스택 프레임의 기준이 되는 레지스터
RSP ESP SP - - 스택 포인터로, 현재 스택의 최상단을 가리킴
R8 R8D R8W - R8B 추가 범용 레지스터
R9 R9D R9W - R9B 추가 범용 레지스터
R10 R10D R10W - R10B 추가 범용 레지스터
R11 R11D R11W - R11B 추가 범용 레지스터
R12 R12D R12W - R12B 추가 범용 레지스터
R13 R13D R13W - R13B 추가 범용 레지스터
R14 R14D R14W - R14B 추가 범용 레지스터
R15 R15D R15W - R15B 추가 범용 레지스터

세부 설명:

  • RAX/EAX/AX/AL: RAX는 주로 연산 결과를 저장하는 레지스터로 사용된다. 예를 들어 곱셈이나 나눗셈 연산의 결과가 여기에 저장된다. 64비트 모드에서는 RAX 전체가 사용되며, 32비트 모드에서는 EAX로 사용된다.
  • RCX/ECX/CX/CL: 루프 카운터로 자주 사용되며, 문자열 조작 및 비트 이동 명령에서도 자주 활용된다.
  • RDX/EDX/DX/DL: 추가 연산이나 I/O 작업에서 사용되며, 곱셈, 나눗셈 연산에서도 보조 역할을 한다.
  • RSI/ESI/SI: 주로 메모리에서 데이터를 읽을 때 소스 주소를 저장하는 레지스터다. 예를 들어, 문자열 조작 함수에서 소스 문자열의 주소를 여기에 저장한다.
  • RDI/EDI/DI: 메모리로 데이터를 쓸 때 목적지 주소를 저장한다. 문자열 복사 같은 함수에서 사용된다.
  • RBP/EBP/BP: 함수 호출 시 스택 프레임의 기준이 되는 베이스 포인터다. 스택 프레임의 시작을 나타내며, 함수의 지역 변수와 매개변수 접근에 사용된다.
  • RSP/ESP/SP: 스택 포인터는 스택의 최상단을 가리킨다. 함수 호출 시에 스택에 데이터를 푸시(push)하거나 팝(pop)할 때 사용된다.

2. 스택 관련 레지스터

스택 관련 연산에 자주 사용되는 두 가지 주요 레지스터는 RSPRBP이다.

  • RSP (Stack Pointer): 스택에서 데이터를 저장하거나 꺼낼 때 현재 스택의 최상단을 가리키는 레지스터다. 푸시(push) 명령어는 스택에 데이터를 저장하고, RSP는 자동으로 감소한다. 반대로 팝(pop) 명령어는 스택에서 데이터를 꺼내고, RSP는 자동으로 증가한다.
  • RBP (Base Pointer): 함수 호출 시에 스택 프레임의 기준이 되는 베이스 포인터다. 함수 내에서 지역 변수와 매개변수를 참조할 때 RBP를 기준으로 오프셋을 사용해 접근한다.

3. 특수 목적 레지스터 (Special Purpose Registers)

특수 목적 레지스터는 주로 CPU의 상태를 저장하거나 특정 연산을 제어하는 데 사용된다.

RIP (Instruction Pointer)

  • 역할: CPU가 다음에 실행할 명령어의 메모리 주소를 가리킨다. 실행 중인 프로그램의 흐름을 제어하며, 명령어가 실행될 때마다 자동으로 다음 명령어를 가리키는 주소로 증가한다.
  • 주요 용도: 분기 명령어(jmp, call 등)가 실행될 때, RIP는 새로운 명령어 주소로 업데이트된다.

RFLAGS (Flags Register)

  • 역할: 연산의 결과 상태를 저장하는 플래그 레지스터다. 산술 및 논리 연산이 끝난 후, 결과에 따라 여러 상태 비트를 설정하거나 클리어한다.
  • 주요 플래그:
    • ZF (Zero Flag): 연산 결과가 0이면 설정된다.
    • SF (Sign Flag): 연산 결과가 음수이면 설정된다.
    • OF (Overflow Flag): 산술 연산에서 오버플로가 발생하면 설정된다.
    • CF (Carry Flag): 연산 중 자리올림 또는 자리내림이 발생하면 설정된다.

CS (Code Segment Register)

  • 역할: 현재 실행 중인 코드의 세그먼트를 나타낸다. 과거 세그먼트 기반 메모리 모델에서 주로 사용되었으며, 현대 시스템에서는 거의 사용되지 않는다.

SS (Stack Segment Register)

  • 역할: 스택 세그먼트를 가리킨다. RSP와 함께 스택에 데이터를 저장하거나 꺼낼 때 사용된다.

FS/GS (Segment Registers)

  • 역할: 현재는 세그먼트 기반 메모리 모델이 거의 사용되지 않지만, FS와 GS는 여전히 특별한 목적으로 사용될 수 있다. 특히 커널 및 스레드별 데이터를 참조하는 데 사용된다.

4. 플로팅 포인트 레지스터 (Floating Point Registers)

플로팅 포인트 연산을 처리하는 레지스터들은 부동 소수점 수를 처리하는 데 사용된다. x86-64 아키텍처는 두 가지 주요 형태의 부동 소수점 연산 유닛을 제공한다:

XMM 레지스터

  • 역할: 128비트 크기의 레지스터로, SSE(SIMD Streaming Extensions) 명령어를 사용하여 벡터 연산 또는 부동 소수점 연산을 처리한다. xmm0부터 xmm15까지 16개의 레지스터가 있다.
  • 주요 용도: 부동 소수점 연산(32비트, 64비트), SIMD(Single Instruction Multiple Data) 연산에서 사용된다.

YMM 레지스터

  • 역할: 256비트 크기의 레지스터로, AVX(Advanced Vector Extensions) 명령어를 지원하는 CPU에서 사용된다.
  • 주요 용도: 128비트보다 더 큰 벡터 연산을 처리하거나 부동 소수점 연산에서 사용된다.

5. 컨트롤 레지스터 (Control Registers)

컨트롤 레지스터는 CPU의 특정 모드 설정이나 상태를 제어하는 데 사용된다.

CR0

  • 역할: CPU의 동작 모드를 설정하는 데 사용된다. CPU

가 보호 모드, 실제 모드 또는 가상 모드에서 작동할지 결정한다.

CR2

  • 역할: 페이지 폴트(page fault)가 발생했을 때, 문제를 일으킨 가상 주소를 저장한다.

CR3

  • 역할: 페이지 테이블 디렉터리의 물리적 주소를 저장한다. 이는 가상 메모리 주소를 물리적 주소로 변환하는 데 사용된다.

CR4

  • 역할: 다양한 CPU 기능을 제어하는 비트들이 포함되어 있다. 예를 들어, 가상화 기술을 활성화하거나, SSE 및 AVX 명령어를 사용할지 여부를 설정한다.

6. 디버그 레지스터 (Debug Registers)

디버그 레지스터는 주로 하드웨어 디버깅에 사용되며, 프로그램 실행 중 특정 메모리 주소 또는 특정 조건이 발생할 때 CPU가 디버깅 중단점을 설정할 수 있다.

  • DR0 ~ DR3: 디버깅 목적으로 사용할 수 있는 브레이크포인트 주소를 저장한다.
  • DR6: 디버깅 상태를 기록한다.
  • DR7: 브레이크포인트를 활성화하고 제어한다.

요약

x86-64 아키텍처에서는 범용 레지스터, 특수 목적 레지스터, 부동 소수점 레지스터, 컨트롤 레지스터 등 다양한 종류의 레지스터가 있다. 이들 각각은 CPU가 명령어를 실행하고 데이터를 처리하는 데 중요한 역할을 한다. 레지스터는 매우 빠른 속도로 작동하며, 명령어 실행 속도에 큰 영향을 미친다.

레지스터와 L1 캐시

레지스터와 L1 캐시는 CPU 내부에 존재하지만, 서로 다른 역할을 수행하는 별개의 구성 요소다. 이 둘은 데이터를 저장하고 접근하는 목적은 같지만, 구조, 용량, 속도, 그리고 사용 방식이 다르다.

1. 레지스터 (Registers)

  • 위치: CPU 내부의 가장 핵심적인 부분에 존재하며, ALU와 직접 연결되어 있다.
  • 역할: CPU가 즉시 사용해야 하는 데이터를 저장하는 초고속 메모리이다. 주로 명령어 실행에 필요한 피연산자나 계산 결과를 일시적으로 저장한다.
  • 크기: 매우 작다. 일반적으로 x86-64 아키텍처에서는 64비트 레지스터가 16개 있다.
  • 속도: CPU에서 접근할 수 있는 가장 빠른 저장 공간이다. 데이터는 레지스터에서 ALU로 바로 전달되며, 메모리 접근 시간이 거의 없다.
  • 예시:
    • 범용 레지스터: RAX, RBX, RCX, RDX, RSP, RBP 등.
    • 플래그 레지스터: 연산 결과를 저장하는 플래그 상태를 유지하는 역할.

2. L1 캐시 (Level 1 Cache)

  • 위치: CPU 코어 내부에 존재하며, CPU와 메인 메모리 사이에서 데이터를 캐싱하는 역할을 한다.
  • 역할: CPU가 자주 접근하는 데이터를 임시 저장하여 빠르게 재사용할 수 있도록 한다. 메인 메모리(RAM)로부터 데이터를 가져오는 시간을 줄이기 위해 설계된 캐시 메모리다.
  • 크기: L1 캐시는 작지만 레지스터보다 훨씬 크다. 일반적으로 코어당 32KB에서 64KB 정도의 용량을 가진다. L1 캐시는 보통 두 가지로 나뉜다:
    • L1 데이터 캐시 (L1D): CPU가 처리하는 데이터에 대한 캐시.
    • L1 명령어 캐시 (L1I): CPU가 실행하는 명령어에 대한 캐시.
  • 속도: 레지스터보다 느리지만 메인 메모리보다 훨씬 빠르다. L1 캐시는 CPU의 클럭 속도에 매우 가까운 속도로 작동한다.

레지스터와 L1 캐시의 차이점

  1. 역할:
    • 레지스터: CPU의 연산에 즉시 필요한 데이터를 저장한다. 명령어 실행 과정에서 데이터를 빠르게 제공하고, 연산 결과를 저장한다.
    • L1 캐시: 자주 사용되는 데이터를 임시 저장하여 메인 메모리 접근을 줄인다. 프로그램이 자주 사용하는 데이터나 명령어를 캐싱한다.
  2. 크기:
    • 레지스터: 매우 적은 수의 데이터를 저장할 수 있다. 레지스터는 CPU 코어당 수십 개밖에 없으며, 저장 공간도 크지 않다(64비트 레지스터가 주로 사용됨).
    • L1 캐시: 수십 KB의 데이터를 저장할 수 있어, 레지스터보다 훨씬 많은 양의 데이터를 저장할 수 있다.
  3. 속도:
    • 레지스터: CPU에서 가장 빠른 메모리. 명령어를 실행하는데 필요한 데이터를 즉시 처리한다.
    • L1 캐시: 레지스터보다 느리지만 메인 메모리보다 훨씬 빠르다. L1 캐시가 존재하지 않으면 CPU는 훨씬 느린 메인 메모리에서 데이터를 읽어와야 한다.
  4. 접근성:
    • 레지스터: CPU 내부에서 ALU와 바로 연결되어 있어 접근 속도가 매우 빠르다.
    • L1 캐시: CPU 코어와 가깝게 배치되어 있지만, 데이터를 캐시에서 찾지 못할 경우(캐시 미스), 메인 메모리에서 데이터를 읽어와야 한다.

요약

  • 레지스터는 CPU가 즉시 사용할 데이터를 저장하는 초고속 메모리로, 매우 작은 용량을 가진다. CPU의 명령어 실행 과정에서 직접 사용된다.
  • L1 캐시는 메모리에서 자주 사용되는 데이터나 명령어를 임시 저장하여, 메인 메모리 접근 속도를 줄이는 역할을 한다. 레지스터보다 크지만 상대적으로 느리다.