보안/시스템 해킹

[ 시스템 해킹 ] Computer Science : 컴퓨터구조

haena02 2022. 7. 11. 04:13
반응형

1. 컴퓨터 구조(Computer Architecture)

 

컴퓨터 구조란 컴퓨터가 효율적으로 작동할 수 있도록

하드웨어와 소프트웨어의 기능을 고안하고, 구성하는 방법을 의미한다.

 

< 컴퓨터 구조의 구성 >

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


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

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

 


2. 폰노이만 구조

 

폰노이만 구조는 컴퓨터 설계 종류 중 하나이다.

초기 컴퓨터 과학자 폰 노이만은 컴퓨터에 연산, 제어, 저장이 세가지의 핵심기능을이 꼭 필요하다곡 생각했다.

현재는 중앙처리장치, 기억장치, 버스를 사용하고 있다. 

 

2.1 중앙처리장치


CPU는 프로그램의 연산을 처리하고 시스템을 관리한다.

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

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

CPU 안에 있는 레지스터와 캐시는 기억장치보다 교환속도가 빠른 데이터 저장소이다. 



2.2 기억장치


기억장치는 용도에 따라 주기억장치와 보조기억장치로 분류된다.

주기억장치는 프로그램 실행과정에서 필요한 데이터들을 임시로 저장하기 위해 사용되며, 대표적으로 램(RAM)이 있다. 여기에 저장되어있는 데이터들은 컴퓨터 전원이 종료되면 휘발된다.

보조기억장치는 운영 체제, 프로그램 등과 같은 데이터를 장기간 보관하고자 할 때 사용됩니다. 대표적으로 하드 드라이브(HDD), SSD(Solid State Drive)가 있다. 여기에 저장된 정보는 전원이 종료되도 휘발되지 않는다.

 


2.3 버스


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

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

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

 

 

3. 명령어 집합 구조(Instruction Set Architecture, ISA)

 

명령어 집합 구조란 CPU가 해석하는 명령어의 집합을 의미한다.
이는 여러 종류가 있는데, 인텔의 x86-64는 고성능 프로세서를 설계하기 위해 사용된다.

이를 기반으로한 CPU들은 많은 전력을 소모하며, 발열도 상대적으로 심하기 때문에 냉각장치가 필요하다.

따라서 임베디드 장비에서는 사용하기 힘들고 보통 데스크톱이나 노트북에서 사용된다.

임베디드에서는 전력 소모와 발열이 적은 ARM이나 MIPS 또는 AVR의 프로세서를 사용하고 있습니다.

3.1 x86-64 아키텍처

 

x64 아키텍처는 인텔의 64비트 CPU 아키텍처이다. 인
n 비트 아키텍처 CPU가 한번에 n비트의 데이터를 처리할 수 있다는 의미이다.

이는 CPU가 이해할 수 있는 데이터의 단위라는 의미에서 WORD라고 부르기도한다.


WORD가 크면 제공할 수 있는 가상 메모리가 커진다.
64비트 아키텍처에서는 이론상 16엑사 바이트(=16,777,216 테라바이트)의 가상메모리를 제공할 수 있다.  이는 웬만해서는 완전한 사용이 불가능할 정도로 큰 크기이다.

 

x86-64는 Intel64, IA-32e, EM64T 또는 amd64라고 불리기도한다. 

 

4. 레지스터

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

x64 아키텍처에는 범용 레지스터, 세그먼트 레지스터, 명령어 포인터 레지스터, 플래그 레지스터가 존재한다.

 

4.1 범용 레지스터(General Register)

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

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

 

rax 함수의  반환 값
rbx x64에서는 주된 용도 없음
rcx 반복문의 반복횟수, 각종 연산의 시행횟수
rdx x64에서는 주된 용도 없음
rsi 데이터를 옮길 때 원본을 가리키는 포인터
rdi 데이터를 옮길 때 목적지를 가리키는 포인터
rsp 사용중인 스택의 위치를 가리키는 포인터
rbp 스택의 바닥을 가리키는 포인터

 

이 외에도 x64에는 r8, r9, … , r15까지의 범용레지스터가 더 존재한다.

 

 

4.2 세그먼트 레지스터(Segment Register)

 

x64 아키텍처에는 cs, ss, ds, es, fs, gs 총 6가지 세그먼트 레지스터가 존재하며, 각 레지스터의 크기는 16비트이다.

세그먼트 레지스터는 x64로 아키텍처가 확장되면서 용도에 큰 변화가 생긴 레지스터이다.

 

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

 

 

4.3  명령어 포인터 레지스터

CPU가 어느 부분의 코드를 실행할지 가리키는게 명령어 포인터 레지스터의 역할이다.

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

 

 

4.4 플래그 레지스터(Flag Register)

 

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

x64 아키텍처에서는 RFLAGS라고 불리는 64비트 크기의 플래그 레지스터가 존재하며, 플래그 레지스터는 자신을 구성하는 여러 비트들로 CPU의 현재 상태를 표현한다.

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

그리고 그 중에서도 여러분이 앞으로 주로 접하게 될 것들은 아래와 같다.

 

CF 부호 없는 수의 연산 결과가 비트의 범위를
넘을 경우 설정 됩니다.
ZF 연산의 결과가 0일 경우 설정 됩니다.
SF 연산의 결과가 음수일 경우 설정 됩니다.
OF 부호 있는 수의 연산 결과가 비트 범위를
넘을 경우 설정 됩니다.

 

플래그를 사용하는 간단한 예로, 3의 값을 갖는 a와 5의 값을 갖는 b가 있을 때, a에서 b를 빼는 연산을 하면, 

연산의 결과가 음수이므로 SF가 설정됩니다. 그러면 CPU는 SF를 통해 a가 b보다 작았음을 알 수 있습니다.

 

4.5 레지스터 호환

 

 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가 이들의 확장된 형태이며, eax, ebx 등은 확장된 레지스터의 하위 32비트를 가르킨다.

예를 들어, eax는 rax의 하위 32비트를 의미합니다.

또한 마찬가지로 과거 16비트 아키텍처인 IA-16과의 호환을 위해 ax, bx, cx, dx, si, di, sp, b 는 eax, ebx, ecx, edx, esi, edi, esp ,ebp의 하위 16비트를 가르킨다.

이들 중 몇몇은 다시 상위 8비트, 하위 8비트로 나뉘는데 이들 전체에 대한 내용은 오른쪽 그림에서 확인할 수 있습니다.

 

반응형