컴퓨터 구조와 명령어 집합 구조

컴퓨터 구조

컴퓨터가 잘 작동할 수 있게 고안한 컴퓨터 도면으로 아래와 같은 것들이 있다.

  • 컴퓨터의 기능 구조에 대한 설계
  • 명령어 집합구조
  • 마이크로 아키텍처
  • 기타 하드웨어 및 컴퓨팅 방법에 대한 설계

 

 

 

 

폰 노이만 구조

오늘 날 현대 컴퓨터의 구조로 연산, 제어, 저장 세 가지의 핵심 기능이 실행될 수 있는 컴퓨터 구조다.

중앙처리장치(Central Processing Unit, CPU), 기억장치(memory), 버스(bus)로 구성된다.

 

중앙처리장치(Central Processing Unit, CPU)

CPU는 컴퓨터의 두뇌로 RAM에서 코드를 가져오고, 실행하고, 결과를 저장하는 일련의 모든 과정을 수행한다.

CPU에는 산술 논리 연산을 처리하는 ALU, 제어장치인 CU, 데이터 저장에 필요한 Register가 있다.

 

 

 

기억장치(memory)

기억장치는 데이터를 저장하기 위해 필요한 장치로 주기억장치와 보조기억장치로 나눌 수 있다.

주기억장치는 프로그램이 실행되기 위해 필요한 코드를 임시로 저장해서 사용하는 데 RAM(Random-Access-Memory)이 대표적이다.

보조기억장치는 운영체제나 프로그램 등 오랫동안 데이터의 저장이 필요한 경우 사용하며 대표적으로는 하드 드라이브(Hard Disk Drive), SSD(Solid State Drive)가 있다.

 

 

 

버스(bus)

컴퓨터 장치간에 데이터를 주고 받을 때 사용되는 통로다.

사용 용도에 따라 데이터 버스(Data Bus), 주소 버스(Address Bus), 제어 버스(Control Bus)등으로 불린다.

 

 

💡 기억장치가 있는데 CPU안에 레지스터가 왜 필요한가요?

CPU의 연산속도에 비해 RAM에 Access하는 시간은 느리다. 때문에 RAM에서 데이터를 가져오는 동안 CPU는 아무것도 하지 않는 일이 발생할 수 있는데 이는 비효율적이다.

이런 문제점을 개선하기 위해 데이터에 Access하는 시간을 줄이고자 했고, Register를 사용하게 됐다.

추가로 Cache를 사용해면 RAM으로부터 데이터를 미리 가져와 CPU가 데이터를 가져오는 시간을 더 단축할 수 있다.
(Cache의 데이터 Access시간이 더 짧기 때문)

 

 

 

 

명령어 집합 구조(ISA)

ISA는 CPU가 해석하는 명령어의 집합을 의미한다.

오늘 날 사용되고 있는 컴퓨터의 스펙과 환경은 매우 다양하므로 ISA 또한 그에 맞게 다양하게 개발되고 있다.
(ex. IA-32 , x86-64(x64), MIPS, AVR 등)

 

x86-64(x64)의 경우 복잡한 명령어들이 포함되어 있기 때문에 고성능 프로세서 설계를 위해 사용한다.

따라서 x86-64(x64)를 사용한 프로세서는 전력 소모와 발열 문제가 심하다.

위 문제를 해결하기 위해선 안정적인 전력 공급과 냉각 장치를 포함할 수 있는 장치에 x86-64(x64)를 사용해야 하는데

데스크탑이나 랩탑이 적절하다.

 

ARM은 x86-64(x64)에 비해 단순화된 구조로 비교적 전력 공급과 발열 문제에서 자유롭다.

따라서 드론, 공유기, 인공지능 스피커처럼 크기가 작은 임베디드 기기들, 스마트폰 같은 경우는 x86-64(x64) 대신 ARM이 적합하다.

 

→ 드림핵은 x86-64 아키텍처를 기준으로 정리

 

 

 

x86-64 아키텍처

WORD: CPU가 한 번에 이해할 수 있는 데이터의 양

 

n 비트 아키텍처

WORD의 크기는 컴퓨터의 구조에 따라 달라지는 데, 예를 들어 ALU가 32비트까지 계산할 수 있고 bus가 전달하는 데이터의 대역폭이 32비트가 최대라면 CPU는 32비트까지만 처리할 수 있게 된다.

 

 

WORD가 크면 유리한 점

32비트 아키텍쳐에서는 가상메모리를 최대 4GB까지만 제공할 수 있지만, 64비트 아키텍쳐에서는 16EB(16 엑사 바이트)까지 제공해줄 수 있다. 또한  CPU가 RAM에서 데이터를 가져오는 횟수를 줄일 수 있다.

 

 

 

 

 

레지스터

x86-64에서 각각의 범용 레지스터는 8바이트를 저장할 수 있다.

(레지스터 이름 앞에 64비트는 r, 32비트에는 e가 앞에 붙으며 16비트는 아무 것도 붙지 않는다)

 

범용 레지스터

이름 주용도
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) 스택의 바닥을 가리키는 포인터

→ 테이블에는 자주 쓰이는 거 위주로 정리했고, 이 외에도 r8-r15가 있다.

 

 

 

 

 

세그먼트 레지스터

이름 용도
cs 코드 영역을 가리키는 포인터
ss 데이터 영역을 가리키는 포인터
ds 스택 메모리 영역을 가리키는 포인터
es 범용적인 용도로 사용
fs 범용적인 용도로 사용
gs 범용적인 용도로 사용

→ 각 레지스터의 크기는 16비트

 

 

 

 

 

명령어 포인터 레지스터

이름 용도
rip(instruction pointer) CPU가 다음에 실행할 명령어를 가리키는 포인터

→ rip크기는 8바이트이다.

 

 

 

 

 

플래그 레지스터

플래그 레지스터는 프로세서의 현재 상태를 저장하고 있는 레지스터이다.

x64 아키텍처에서는 플래그 레지스터를 RFLAGS라고 부르며 64개의 플래그를 사용할 수 있다.

하지만 실제로는 오른쪽 20여개의 비트들만 사용하고 그 중에서도 아래 4개는 자주 접하게 되는 플래그들이다.

 

플래그 의미
CF(Carry Flag) 부호 없는 수의 연산 결과가 비트의 범위를 넘을 경우 설정 됩니다.
ZF(Zero Flag) 연산의 결과가 0일 경우 설정 됩니다.
SF(Sign Flag) 연산의 결과가 음수일 경우 설정 됩니다.
OF(Overflow Flag) 부호 있는 수의 연산 결과가 비트 범위를 넘을 경우 설정 됩니다.

 

 

 

 

 

레지스터 호환

IA-32를 확장한 것이 x86-64이므로 IA-32의 CPU 레지스터들은 x86-64에서도 사용이 가능하다.

예를 들어 RAX의 하위 32비트는 EAX이며, EAX의 하위 16비트는 AX이고, AX에서 상위 8비트와 하위 8비트는 각각 AHAL로 볼 수 있다. 나머지 레지스터도 이와 똑같으며 그 관계가 위 사진에 잘 정리되어 있다.

 

 

 

 

 


Quiz

퀴즈 1

 

퀴즈 2

 

퀴즈 3

 

퀴즈 4
퀴즈 5

 

:)

복사했습니다!