[크래프톤 정글] cpu 레지스터
레지스터는 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. 스택 관련 레지스터
스택 관련 연산에 자주 사용되는 두 가지 주요 레지스터는 RSP와 RBP이다.
- 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 캐시의 차이점
- 역할:
- 레지스터: CPU의 연산에 즉시 필요한 데이터를 저장한다. 명령어 실행 과정에서 데이터를 빠르게 제공하고, 연산 결과를 저장한다.
- L1 캐시: 자주 사용되는 데이터를 임시 저장하여 메인 메모리 접근을 줄인다. 프로그램이 자주 사용하는 데이터나 명령어를 캐싱한다.
- 크기:
- 레지스터: 매우 적은 수의 데이터를 저장할 수 있다. 레지스터는 CPU 코어당 수십 개밖에 없으며, 저장 공간도 크지 않다(64비트 레지스터가 주로 사용됨).
- L1 캐시: 수십 KB의 데이터를 저장할 수 있어, 레지스터보다 훨씬 많은 양의 데이터를 저장할 수 있다.
- 속도:
- 레지스터: CPU에서 가장 빠른 메모리. 명령어를 실행하는데 필요한 데이터를 즉시 처리한다.
- L1 캐시: 레지스터보다 느리지만 메인 메모리보다 훨씬 빠르다. L1 캐시가 존재하지 않으면 CPU는 훨씬 느린 메인 메모리에서 데이터를 읽어와야 한다.
- 접근성:
- 레지스터: CPU 내부에서 ALU와 바로 연결되어 있어 접근 속도가 매우 빠르다.
- L1 캐시: CPU 코어와 가깝게 배치되어 있지만, 데이터를 캐시에서 찾지 못할 경우(캐시 미스), 메인 메모리에서 데이터를 읽어와야 한다.
요약
- 레지스터는 CPU가 즉시 사용할 데이터를 저장하는 초고속 메모리로, 매우 작은 용량을 가진다. CPU의 명령어 실행 과정에서 직접 사용된다.
- L1 캐시는 메모리에서 자주 사용되는 데이터나 명령어를 임시 저장하여, 메인 메모리 접근 속도를 줄이는 역할을 한다. 레지스터보다 크지만 상대적으로 느리다.