[Dreamhack] Background: 2 - Computer Architecture

securitykss·2022년 10월 20일
0
post-thumbnail

이 글은 https://dreamhack.io/lecture/courses/43을 토대로 작성한 글입니다.

1. Introduction

지난 Background: Linux Memory Layout에 이어서

이번에는 Computer Architecture(컴퓨터 구조)에 대한 정리를 하겠다.

여러 부품들(CPU, GPU, LAN Card 등)이 모여 '컴퓨터'라는 하나의 기계로서 작동할 수 있게 컴퓨터에 대한 기본 설계를 하고 이러한 설계에 맞춰 여러 하드웨어 및 소프트웨어를 개발하고, 이들을 조립해서 컴퓨터가 완성된다.

컴퓨터 과학에서는 이러한 과정, 설계를 Computer Architecture라고 한다.

Computer Architecture, Instruction Set Architecture(ISA), 그리고 ISA 중 하나인 Intel x86-64에 대해 정리를 해보려고 한다.

2. Computer Architecture & ISA

2.1 Computer Architecture

Computer Architecture(컴퓨터 구조)란?

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

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

ISA(명령어 집합구조) 란?

CPU의 명령어에 대한 설계를 ISA라고 불리며, CPU가 처리해야하는 명령어를 설계하는 분야이다.

대표적으로 ARM, MIPS, AVR, Intel의 x86, x86-64가 있다.

'컴퓨터 기능 구조에 대한 설계' 란?

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

이 중에서 폰 노이만 구조에 대해 간단하게 알아보자.

2.2 폰 노이만 구조

폰 노이만은 컴퓨터에 연산, 제어, 저장의 세 가지 기능이 필요하다고 생각했다.

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

https://learn.dreamhack.io/43#5 (그림 출처)

2.2.1 CPU

CPU란?

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

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

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

2.2.2 Memory

Memory란?

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

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

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

2.2.3 Bus

Bus란?

컴퓨터 부품과 부품 사이 또는 컴퓨터와 컴퓨터 사이에 신호를 전송하는 통로를 말한다.

대표적으로 데이터가 이동하는 Data Bus(데이터 버스), 주소를 지정하는 Address Bus(주소 버스), 읽기/쓰기를 제어하는 Control Bus(제어 버스)가 있다. 이 외에도 랜선이나 데이터 전송 소프트웨어, 프로토콜 등도 Bus라 불린다.

이제 ISA(명령어 집합구조)에 대해 알아보자.

2.3 ISA

ISA란?

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

ISA는 IA-32 , x86-64(x64), MIPS, AVR 등 다양하게 존재한다. 이렇게 다양한 ISA가 개발되고 사용되는 이유는 모든 컴퓨터가 동일한 수준의 연산 능력을 요구하지 않으며, 컴퓨팅 환경도 다양하기 때문이다.


x86-64 프로세서는 PC나 서버용으로 많이 사용된다.

그 외에 x86-64에 비해 발열이 적은 ARM이나 MIPS 또는 AVR의 프로세서는 배터리를 사용하는 임베디드 기기에 많이 사용된다.

스마트폰이나 태블릿 같은 경우는 ARM을 주로 사용한다.

-> 이 중에서 Intel의 x86-64에 대해 알아보자.

3. x86-64

3.1 IA-32, AMD64

IA-32, x86-32 모두 Intel의 32비트 CPU 아키텍처이다.

32비트 아키텍처에서는 CPU가 한번에 처리할 수 있는 데이터 단위인 WORD의 크기가 32비트(4바이트)이다.

IA-32는 4,294,967,296바이트(=4기가 바이트)가 최대로 제공 가능한 가상메모리의 크기이다.

x64, x86-64, AMD64 모두 Intel의 64비트 CPU 아키텍처이다.

64비트 아키텍처에서는 CPU가 한번에 처리할 수 있는 데이터 단위인 WORD의 크기가 64비트(8바이트)이다.

x86-64 16엑사 바이트(=16,777,216 테라바이트)의 가상메모리를 제공할 수 있다.

WORD CPU의 구성 중 ALU, Register 등은 32비트, 64비트 단위로 연산 및 처리를 한다는 의미이다.

WORD가 클수록 가상메모리의 공간의 크기가 달라진다.

즉, 고사양 게임, 서버 등 많은 메모리 자원을 필요로 하는 것들은 IA-32보다 x86-64를 사용한다.

3.2 x86-64: Register

Register란?

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

x64 아키텍처에는 범용 레지스터(General Register), 세그먼트 레지스터(Segment Register), 명령어 포인터 레지스터(Instruction Pointer Register, IP), 플래그 레지스터(Flag Register)가 존재한다.

3.2.1 범용 레지스터

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

이 외에 x64에는 r8, r9, ... , r15까지의 범용 레지스터가 있다.

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

3.2.2 세그먼트 레지스터

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

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

3.2.3 명령어 포인터 레지스터

프로그램은 일련의 기계어 코드들로 이루어져 있습니다. 이 중에서 CPU가 어느 부분의 코드를 실행할지 가리키는게 명령어 포인터 레지스터의 역할입니다. x64 아키텍처의 명령어 레지스터는 rip이며, 크기는 8바이트입니다.

3.2.4 플래그 레지스터

플래그 레지스터는 프로세서의 현재 상태를 저장하고 있는 레지스터이다. x64 아키텍처에서는 RFLAGS라고 불리는 64비트 크기의 플래그 레지스터가 존재한다.

깃발을 올리고, 내리는 행위로 신호를 전달하듯, 플래그 레지스터는 자신을 구성하는 여러 비트들로 CPU의 현재 상태를 표현한다.

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

이 중에서도 밑의 표와 같이 4개의 CF(Carry Flag), ZF(Zero Flag), SF(Sign Flag), OF(Overflow Flag)**가 자주 쓰인다.

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

3.3 레지스터 호환

IA-32의 확장 아키텍처인 x86-64이고, 이 두 아키텍처는 호환이 가능하다.

IA-32

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

x86-64

CPU의 레지스터들은 64비트 크기를 가지며, 이들의 명칭은 각각 rax, rbx, rcx, rdx, rsi, rdi, rsp, rbp 등이 있다.

이 두 IA-32는 x86-64의 하위호환 아키텍처이다.

RAX는 64비트, EAX는 32비트, AX는 16비트, AH, AL은 8비트의 크기이다.

https://learn.dreamhack.io/43#11 (그림출처)

4. Conclusion

범용 레지스터(General Register): 주 용도는 있으나, 그 외의 용도로도 자유롭게 사용할 수 있는 레지스터. x64에는 rax, rbx, rcx, rdx, rsi, rdi, rsp, rbp, r8-r15가 있다.

세그먼트 레지스터(Segment Register): 과거에는 메모리 세그멘테이션이나, 가용 메모리 공간의 확장을 위해 사용됐으나, 현재는 주로 메모리 보호를 위해 사용되는 레지스터 x64에는 cs, ss, ds, es, fs, gs가 있다.

플래그 레지스터(Flag Register): CPU의 상태를 저장하는 레지스터

명령어 포인터 레지스터(Instruction Pointer Register, IP): CPU가 실행해야할 코드를 가리키는 레지스터. x64에서는 rip가 있다.

마치며

여기까지 Computer Architecture에 대하여 간략하게 알아보았다.

다음 시간에는 Background: x86 Assembly에 대해 알아보자.

Reference

https://dreamhack.io/lecture/courses/43
https://biz.chosun.com/it-science/ict/2022/08/11/EYJ6HTMB4ZDY3O7HYFXG3RM52A/ (사진 출처)

profile
보안 공부를 하는 학생입니다.

0개의 댓글