본문 바로가기
CTF/Dreamhack

[Dreamhack] System Hacking STAGE 2 - Computer Architecture

by 8희 2022. 10. 5.

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

컴퓨터 구조

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

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

- ‘컴퓨터의 기능 구조에 대한 설계’란 컴퓨터가 연산을 효율적으로 하기 위해 어떤 기능들이 컴퓨터에 필요한지 고민하고, 설계하는 분야. 대표적으로 폰 노이만 구조, 하버드 구조, 수정된 하버드 구조가 있다.

 

- CPU의 명령어에 대한 설계는 명령어 집합구조(Instruction Set Architecture)라고 불리며, CPU가 처리해야하는 명령어를 설계하는 분야. 대표적으로 ARM, MIPS, AVR, 인텔의 x86 및 x86-64 등이 있다.

- CPU의 하드웨어적 설계는 마이크로 아키텍처(Micro Architecture)라고 불리며 정의된 명령어 집합을 효율적으로 처리할 수 있도록, CPU의 회로를 설계하는 분야

 

* 컴퓨터 구조의 세부 분야

  • 기능 구조의 설계
    • 폰 노이만 구조
    • 하버드 구조
    • 수정된 하버드 구조
  • 명령어 집합구조
    • x86, x86-64
    • ARM
    • MIPS
    • AVR
  • 마이크로 아키텍처
    • 캐시 설계
    • 파이프라이닝
    • 슈퍼 스칼라
    • 분기 예측
    • 비순차적 명령어 처리
  • 하드웨어 및 컴퓨팅 방법론
    • 직접 메모리 접근

 

폰 노이만 구조

- 초기 컴퓨터 과학자 중 한명인 폰 노이만은 컴퓨터에 연산, 제어, 저장의 세 가지 핵심 기능이 필요하다고 생각

- 근대의 컴퓨터는 연산과 제어를 위해 중앙처리장치(Central Processing Unit, CPU)를, 저장을 위해 기억장치(memory),장치간에 데이터나 제어 신호를 교환할 수 있도록 버스(bus)라는 전자 통로를 사용

 

1. 중앙처리장치

- CPU는 프로그램의 연산을 처리하고 시스템을 관리하는 컴퓨터의 두뇌

- 프로세스의 코드를 불러오고, 실행하고, 결과를 저장하는 일련의 모든 과정이 CPU에서 일어난다.

- CPU는 산술/논리 연산을 처리하는 산술논리장치(Arithmetic Logic Unit, ALU)와 CPU를 제어하는 제어장치(Control Unit), CPU에 필요한 데이터를 저장하는 레지스터(Register) 등으로 구성

 

2. 기억장치

- 기억장치는 컴퓨터가 동작하는데 필요한 여러 데이터를 저장하기 위해 사용되며, 용도에 따라 주기억장치와 보조기억장치로 분류

- 주기억장치는 프로그램 실행과정에서 필요한 데이터들을 임시로 저장하기 위해 사용되며, 대표적으로 램(Random-Access Memory, RAM)이 있다.

- 반대로 보조기억장치는 운영 체제, 프로그램 등과 같은 데이터를 장기간 보관하고자 할 때 사용되며, 대표적으로 하드 드라이브(Hard Disk Drive, HDD), SSD(Solid State Drive)가 있다.

 

3. 버스

- 버스는 컴퓨터 부품과 부품 사이 또는 컴퓨터와 컴퓨터 사이에 신호를 전송하는 통로

- 대표적으로 데이터가 이동하는 데이터 버스(Data Bus), 주소를 지정하는 주소 버스(Address Bus), 읽기/쓰기를 제어하는 제어 버스(Control Bus)가 있다.

- 이 외에도 랜선이나 데이터 전송 소프트웨어, 프로토콜 등도 버스라고 불린다. 

 

명령어 집합 구조

- 명령어 집합 구조(Instruction Set Architecture, ISA)란 CPU가 해석하는 명령어의 집합을 의미

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

 


x86-64 아키텍처

x86-64 아키텍처

- x64 아키텍처는 인텔의 64비트 CPU 아키텍처, 인텔의 32비트 CPU 아키텍처인 IA-32를 64비트 환경에서 사용할 수 있도록 확장한 것으로, 대다수의 개인용 컴퓨터들이 인텔의 x64 CPU를 사용하고 있다. 

 

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

- 레지스터는 CPU가 데이터를 빠르게 저장하고 사용할 때 이용하는 보관소

- 산술 연산에 필요한 데이터를 저장하거나 주소를 저장하고 참조하는 등 다양한 용도로 사용

 

범용 레지스터

자주 쓰이는 범용 레지스터

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

- x86-64에서 각각의 범용 레지스터는 8바이트를 저장할 수 있으며, 부호 없는 정수를 기준으로 2^64 - 1까지의 수를 나타낼 수 있다.

 

세그먼트 레지스터

- x64 아키텍처에는 cs, ss, ds, es, fs, gs 총 6가지 세그먼트 레지스터가 존재하며, 각 레지스터의 크기는 16비트입니다. 세그먼트 레지스터는 x64로 아키텍처가 확장되면서 용도에 큰 변화가 생긴 레지스터

 

- 현대의 x64에서 cs, ds, ss 레지스터는 코드 영역과 데이터, 스택 메모리 영역을 가리킬 때 사용되고, 나머지 레지스터는 운영체제 별로 용도를 결정할 수 있도록 범용적인 용도로 제작된 세그먼트 레지스터

 

명령어 포인터 레지스터

- 프로그램은 일련의 기계어 코드들로 이루어져 있다. 이 중에서 CPU가 어느 부분의 코드를 실행할지 가리키는게 명령어 포인터 레지스터의 역할

- x64 아키텍처의 명령어 레지스터는 rip이며, 크기는 8바이트

 

플래그 레지스터

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

- x64 아키텍처에서는 RFLAGS라고 불리는 64비트 크기의 플래그 레지스터가 존재하며, 과거 16비트 플래그 레지스터가 확장된 것

- 플래그 레지스터는 자신을 구성하는 여러 비트들로 CPU의 현재 상태를 표현

- RFLAGS는 64비트이므로 최대 64개의 플래그를 사용할 수 있지만, 실제로는 오른쪽의 20여개의 비트만 사용

 

 

레지스터 호환

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

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

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