컴퓨터 아키텍처 기초
CPU 구조, 폰 노이만 구조, ISA, x86-64 레지스터까지 컴퓨터 아키텍처 기초를 정리했습니다.
컴퓨터 구조와 명령어 집합 구조
컴퓨터 구조
CPU, 메모리, 입출력 장치와 같은 하드웨어 구성 요소가 어떻게 설계되고 상호작용하는지 연구하는 학문
- 명령어 집합구조(Instruction Set Architecture, ISA): CPU의 명령어에 대한 설계
- 마이크로 아키텍쳐(Micro Architecture): CPU의 하드웨어적 설계
폰 노이만 구조(Von Neumann Architecture)

중앙처리장치(CPU)
CPU는 프로그램의 연산을 처리하고 시스템을 관리하는 컴퓨터의 두뇌
- 산술논리장치(Arithmetic Logic Unit, ALU): 산술/논리 연산 처리
- 제어장치(Control Unit): CPU를 제어
- 레지스터(Register): CPU에 필요한 데이터 저장
기억장치
컴퓨터가 동작하는데 필요한 여러 데이터를 저장하기 위해 사용
(용도에 따라 주기억장치, 보조기억장치 분류)
- 주기억장치: 프로그램 실행과정에서 필요한 데이터들을 임시로 저장하기 위해 사용 대표적으로 램(Random-Access Memory, RAM)이 있다.
- 보조기억장치: 운영 체제, 프로그램 등과 같은 데이터를 장기간 보관하고자 할 때 사용 대표적으로 하드 드라이브(Hard Disk Drive, HDD), SSD(Solid State Drive)가 있다.
버스
컴퓨터 부품과 부품 사이 또는 컴퓨터 사이에 신호를 전송하는 통로
- 데이터 버스(Data Bus): 데이터가 이동
- 주소 버스(Address Bus): 주소 지정
- 제어 버스(Control Bus): 읽기/쓰기를 제어
명령어 집합 구조(ISA)
CPU가 해석하는 명령어의 집합을 의미
기계어를 CPU가 어떻게 해석하고 처리할지 방법을 정의
CISC 와 RISC
ISA 의 두 가지 종류
- CISC(Complex Instruction Set Computer)
- 1970년대에 나온 명령어 집합 구조
- 메모리 효율성에 초점을 맞춰 개발된 구조
- RISC(Reduced Instruction Set Coomputer)
- 1980년대에 나온 명령어 집합 구조
- CISC 구조의 몇 가지 단점을 해결하기 위해 개발
- 명령어의 길이가 적고 짧다
- 고정된 길이의 명령어 사용
| 구조 | 특징 | 예시 |
|---|---|---|
| CISC | 복잡한 명령어 제공 | x86 |
| RISC | 단순하고 빠른 명령어 | ARM |
→ 현대 스마트폰 CPU는 대부분 ARM(RISC) 기반
x86-64 아키텍처
x86 아키텍처와 호환되는 64비트 아키텍처
- n 비트 아키텍처
- 64, 32: CPU가 한번에 처리할 수 있는 데이터의 크기
- WORD: CPU가 이해할 수 있는 데이터의 단위
- 레지스터 크기: CPU 내부의 아주 빠른 임시 저장 공간인 레지스터가 한 번에 저장할 수 있는 데이터의 양
- ALU 연산 데이터 크기: CPU 안에 있는 ALU에서 연산할 수 있는 데이터의 크기
- 표현 가능한 주소의 크기(데이터의 크기): 메모리 상의 데이터를 가리키기 위해 사용할 수 있는 주소 범위, 즉 한 번에 접근할 수 있는 메모리 크기를 결정
- 버스(Bus)의 대역폭: CPU와 메모리, 또는 다른 부품들 사이에서 한 번에 전송할 수 있는 데이터의 양
** 어셈블리어 WORD: 16bit 부호 없는 정수를 다룰 때 사용하는 자료형
- WORD가 크면 유리한 점
- 현대의 PC 대부분 64비트 아키텍쳐 CPU 사용
- 32비트 아키텍처 가상 메모리 공간 = 4기가 바이트
- 64비트 아키텍처 가상 메모리 공간 = 16엑사 바이트
- 현대의 PC 대부분 64비트 아키텍쳐 CPU 사용
x86-64 아키텍처: 레지스터
레지스터: CPU가 데이터를 빠르게 저장하고 사용할 때 이용하는 보관소 , 산술 연산에 필요한 데이터를 저장하거나 주소를 저장하고 참조하는 등 다양한 용도로 사용
- 범용 레지스터(General Purpose Register)
- 데이터 연산을 위해 사용되는 레지스터
- 8바이트까지 저장 가능
- 부호없는 정수 기준으로 2^64 - 1 까지의 수 저장 가능
- 레지스터 종류 및 주용도
| 레지스터 이름 | 의미 | 주용도 | | — | — | — | | rax | Accumulator Register | 함수의 반환 값 | | rbx | Base Register | x64에서는 주된 용도 없음 | | rcx | Counter Register | 반복문의 반복 횟수, 각종 연산의 시행 횟수 | | rdx | Data Register | x64에서는 주된 용도 없음 | | rsi | Source Index | 데이터를 옮길 때 원본을 가리키는 포인터 | | rdi | Destination Index | 데이터를 옮길 때 목적지를 가리키는 포인터 | | rsp | Stack Pointer | 사용중인 스택의 위치를 가리키는 포인터 | | rbp | Stack Base Pointer | 스택의 바닥을 가리키는 포인터 |
- 세그먼트 레지스터(Segment Register)
- x86 아키텍처에서 메모리를 세그먼트 단위로 접근하는 데 사용되는 특수한 레지스터
→ 메모리를 여러 구역으로 나눠서, 어느 구역인지 먼저 정한 뒤 그 안의 위치를 찾는 방식
- 세그먼트: 시작 구역 번호
- 오프셋: 그 구역에서 얼마나 떨어졌는지
- 과거엔 16비트 프로세서를 사용하였는데, 이 때 CPU가 직접 접근할 수 있는 주소 공간이 작았기 때문에 메모리를 효율적으로 관리하기 위해 등장
- 16비트 레지스터로 접근할 수 있는 주소 공간이 작았기 때문에 16비트 범위 밖에 있는 주소에 접근할 때, cs:offset → cs«4 + offset으로 계산하여 16비트 범위 밖에 있는 주소까지 접근 가능하게 함
- x64 아키텍쳐가 등장하면서, 사용 가능한 메모리 주소 범위가 매우 넓어져 그 용도가 변경되었다.
- cs, ds, ss 레지스터는 각각 코드 영역, 데이터 영역, 스택 영역을 저장할 때 사용
- es, fs, gs 레지스터는 범용적인 용도로 사용
- 각 레지스터의 크기는 16비트
- x86 아키텍처에서 메모리를 세그먼트 단위로 접근하는 데 사용되는 특수한 레지스터
→ 메모리를 여러 구역으로 나눠서, 어느 구역인지 먼저 정한 뒤 그 안의 위치를 찾는 방식
| 이름 | 주용 | | — | — | | CS(Code Segment) | 실행할 코드의 시작 주소 | | DS(Data Segment) | 프로그램에 지정된 데이터 영역의 시작 주소 | | SS(Stack Segment) | 스택 영역의 시작 주소 | | ES, FS, GS | 범용적인 용도로 사용 |
- 명령어 포인터 레지스터
- CPU가 어느 부분의 코드를 실행할지 가리키는 역할
- x64 아키텍처의 명령어 레지스터는 rip, 크기는 8바이트
- 플래그 레지스터
- CPU가 연산을 수행한 후 결과의 상태를 저장하는 특수한 레지스터
- x64 아키텍처에서는 RFLAGS 라고 하는 8바이트 크기의 플래그 레지스터가 존재하며, 64비트를 저장할 수 있기 때문에 총 64개의 플래그를 저장할 수 있음(과거 16비트 플래그 레지스터가 확장된 것)
- 깃발을 올리고, 내리는 행위로 신호를 전달하듯, 플래그 레지스터는 자신을 구성하는 여러 비트들로 CPU의 현재 상태를 표현
- 20여개의 비트만 사용
- 상태 플래그로 연산을 수행한 뒤 결과의 상태를 저장하는데 사용

플래그 의미 CF(Carry Flag) 부호 없는 수의 연산 결과가 비트의 범위를 넘을 경우 설정됨 ZF(Zero Flag) 연산의 결과가 0일 경우 설정됨 SF(Sign Flag) 연산의 결과가 음수일 경우 설정됨 OF(Overflow Flag) 부호 있는 수의 연산 결과가 비트 범위를 넘을 경우 설정됨 - 레지스터 호환
- 인텔의 x86 아키텍처인 IA-32의 레지스터는 모두 32비트 크기를 가지며 모두 e가 붙은 이름을 가지고 있음
- 범용 레지스터는 32비트 레지스터가 확장된 형태로 모두 r이 붙는다는 특징을 가지고 있음
- EAX 는 RAX의 하위 32비트
-
AX → AH, AL 로 나뉜다. AH는 상위 8비트, AL은 하위 8비트를 의미

Comments