본문 바로가기

정보보안

Computer Science : Computer Architecture

본 게시물은 DreamHack의 System Hacking 과정을 토대로 작성되었습니다.

 

컴퓨터는 각자 다른 기능을 수행하는 여러 부품들(CPU, GPU, 저장장치 등)의 도움으로 작동합니다.

각 부품들은 특징이 뚜렷하여 컴퓨터에서 고유의 기능을 수행합니다.

 

서로 다른 부품들이 모여서 컴퓨터라는 하나의 기계로서 작동할 수 있는 것은, 컴퓨터에 대한 기본 설계가 존재하기 때문입니다. 이러한 설계를 컴퓨터 구조(Computer Architecture)라고 부릅니다.

 

컴퓨터 구조 중에서 특히 CPU가 사용하는 명령어와 관련된 설계를 명령어 집합구조(Instruction Set Architecture)라고 합니다. 널리 사용되는 ISA 중 하나가 인텔의 x86-64 아키텍처입니다.

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

컴퓨터 구조(Computer Architecture)란 컴퓨터가 효율적으로 작동할 수 있도록 하드웨어 및 소프트웨어의 기능을 고안하고, 이들을 구성하는 방법을 말합니다.

 

컴퓨터 구조는 컴퓨터의 기능 구조에 대한 설계, 명령어 집합구조, 마이크로 아키텍처, 기타 하드웨어 및 컴퓨팅 방법에 대한 설계 등이 포함됩니다.

  • 컴퓨터의 기능 구조에 대한 설계 : 컴퓨터가 연산을 효율적으로 하기 위해 어떤 기능들이 컴퓨터에 필요한지 고민하고 설계하는 분야
  • 명령어 집합구조 : CPU의 명령어에 대한 설계(x86, x86-64 등)
  • 마이크로 아키텍처 : CPU의 하드웨어적 설계. CPU의 회로를 설계하는 분야

폰 노이만 구조

초기 컴퓨터 과학자 중 한명인 폰 노이만은 컴퓨터에 연산, 제어, 저장 세 가지 핵심 기능이 필요하다고 생각했습니다.근대의 컴퓨터는 연산과 제어를 위해 중앙처리장치(CPU), 저장을 위한 기억장치를 사용합니다. 그리고 장치 간에 데이터나 제어 신호를 교환할 수 있도록 버스를 사용합니다.

 

중앙처리장치

CPU는 프로그램의 연산을 처리하고 시스템을 관리하는 컴퓨터의 두뇌입니다.프로세스의 코드를 불러오고, 실행하고, 결과를 저장하는 일련의 모든 과정이 CPU에서 일어납니다.CPU는 산술/논리 연산을 처리하는 산술논리장치(ALU), CPU를 제어하는 제어장치(CU),
CPU에 필요한 데이터를 저장하는 레지스터(Register) 등으로 구성됩니다.

 

기억장치

기억장치는 컴퓨터가 동작하는데 필요한 여러 데이터를 저장하기 위해 사용됩니다.주기억장치는 프로그램 실행 과정에서 필요한 데이터들을 임시로 저장하기 위해 사용되며, 대표적으로 램(RAM)이 있습니다.보조기억장치는 운영체제, 프로그램 등과 같은 데이터를 장기간 보관하고자 할 때 사용되며, 대표적으로 HDD, SSD 등이 있습니다.

 

버스

버스는 컴퓨터 부품과 부품 사이 또는 컴퓨터와 컴퓨터 사이에 신호를 전송하는 통로입니다.데이터가 이동하는 데이터 버스, 주소를 지정하는 주소 버스, 읽기/쓰기를 제어하는 제어 버스가 있습니다.

 

명령어 집합구조

명령어 집합구조(ISA)란 CPU가 해석하는 명령어의 집합을 의미합니다.

프로그램은 기계어로 이루어져 있는데, 프로그램을 실행하면 이 명령어들을 CPU가 읽고 처리합니다.

ISA는 IA-32, x86-64, MIPS, AVR 등 다양하게 존재하며, 용도나 환경에 따라 선택하여 사용할 수 있습니다.

예를 들어, 인텔의 x86-64는 고성능 프로세서를 설계하기 위해 사용됩니다.드론과 같은 배터리를 사용하거나 크기가 작은 임베디드 기기들은 전력 소모와 발열이 적은 ARM이나 MIPS 또는 AVR의 프로세서를 사용합니다.

 

x86-64 아키텍처

x64 아키텍처는 인텔의 64비트 CPU 아키텍처입니다. 인텔의 32비트 CPU 아키텍처인 IA-32를 64비트 환경에서 사용할 수 있도록 확장한 것으로, 대부분의 개인용 컴퓨터들이 인텔의 x64 CPU를 사용하고 있습니다.여기서 64와 32는 CPU가 한 번에 처리할 수 있는 데이터의 크기입니다. 이를 WORD라고 부릅니다.

 

x86-64 아키텍처 : 레지스터

레지스터는 CPU가 데이터를 빠르게 저장하고 사용할 때 이용하는 보관소이며, 산술 연산에 필요한 데이터를 저장하거나 주소를 저장하고 참조하는 등 다양한 용도로 사용됩니다.

 

범용 레지스터 : 주 용도는 있으나, 그 외의 다양한 용도로 사용될 수 있는 레지스터

이름 주용도
rax (accumulator register) 함수의 반환 값
rbx (base register) 주된 용도 없음
rcx (counter register) 반복문의 반복 횟수, 각종 연산의 시행 횟수
rdx (data register) 주된 용도 없음
rsi (source index) 데이터를 옮길 때 원본을 가리키는 포인터
rdi (destination index) 데이터를 옮길 때 목적지를 가리키는 포인터
rsp (stack pointer) 사용중인 스택의 위치를 가리키는 포인터
rbp (stack base pointer) 스택의 바닥을 가리키는 포인터

세그먼트 레지스터

  • cs, ds, ss 레지스터 : 코드 영역, 데이터, 스택 메모리 영역을 가리킬 때 사용
  • es, fs, gs 레지스터 : 운영체제 별로 용도를 결정

명령어 포인터 레지스터

  • rip 레지스터 : CPU가 어느 부분의 코드를 실행할 지 가리키는 포인터

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

  • CF(Carry Flag) : 부호 없는 수의 연산 결과가 비트의 범위를 넘을 경우 설정
  • ZF(Zero Flag) : 연산의 결과가 0일 경우 설정
  • SF(Sign Flag) : 연산의 결과가 음수일 경우 설정
  • OF(Overflow Flag) : 부호 있는 수의 연산의 결과가 비트 범위를 넘을 경우 설정

레지스터 호환

x86-64 아키텍처는 IA-32의 64비트 확장 아키텍처이며, 호환이 가능합니다.

IA-32에서 CPU의 레지스터들은 32비트 크기를 가지며, 이들의 명칭은 각각 eax, ebx, ecx, edx, esi, edi, esp, ebp입니다.

호환성을 위해 이 레지스터들은 x86-64에서도 그대로 사용이 가능합니다.

앞서 확인했던 rax, rbx, rcx, rdx, rsi, rdi, rsp, rbp는 이들의 확장된 형태이며, 확장된 레지스터의 하위 32비트를 가리킵니다.

또한 과거 16비트 아키텍처인 IA-16과의 호환을 위해 ax, bx, cx, dx, si, di, sp, bp는 eax, ebx, ... 의 하위 16비트를 가리킵니다.